【发布时间】:2019-09-06 16:51:48
【问题描述】:
在多对多关系上反序列化 JsonManagedReference
杰克逊版本:2.9.7
由@JsonManagedReference/@JsonBackReference 管理的具有多对多关系的对象不能被反序列化。这最容易通过示例来展示。
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 看起来,当检查反向引用类型是否与引用类型匹配时,它没有检查反向引用端的集合的包含类型。
【问题讨论】:
标签: spring hibernate spring-boot