对多对多关系反序列化JsonManagedReference
Jackson版本:2.9.7
由@ JsonManagedReference / @ JsonBackReference管理的具有ManyToMany关系的对象无法反序列化。举个例子最容易显示出来。
public class JsonReferenceTest {
class Customer {
@JsonManagedReference("users")
public Collection<User> users = new ArrayList<>();
public String name = "company";
}
class User {
@JsonBackReference("users")
public Collection<Customer> customers = new ArrayList<>();
public String name = "user";
}
ObjectMapper objectMapper = new ObjectMapper();
@Test
public void testDeserialize() throws IOException {
String customer = "{\"name\":\"asdf\"}";
objectMapper.readValue(customer, Customer.class);
}
}
运行以下测试结果:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot handle managed/back reference 'users': back reference type (java.util.Collection) not compatible with managed type (com.widewail.JsonReferenceTest$Customer)
at [Source: (String)"{"name":"asdf"}"; line: 1, column: 1]
进入BeanDeserializerBase时,看起来好像在检查反向引用类型是否与引用类型匹配时,它并没有在反向引用侧检查集合的包含类型。
答案 0 :(得分:0)
如JsonBackReference的文档所述,您不能将其与Collection一起使用。
用于指示关联属性是
一部分的注释 领域之间的双向联系;并且其角色是“孩子”(或 “后退”)链接。该属性的值类型必须是Bean:它不能 是集合,地图,数组或枚举。
您可以将JsonIdentityInfo用作here。