对多对多关系反序列化JsonManagedReference

时间:2019-04-16 14:32:37

标签: spring hibernate spring-boot

对多对多关系反序列化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时,看起来好像在检查反向引用类型是否与引用类型匹配时,它并没有在反向引用侧检查集合的包含类型。

1 个答案:

答案 0 :(得分:0)

如JsonBackReference的文档所述,您不能将其与Collection一起使用。

  

用于指示关联属性是
一部分的注释   领域之间的双向联系;并且其角色是“孩子”(或   “后退”)链接。该属性的值类型必须是Bean:它不能   是集合,地图,数组或枚举

您可以将JsonIdentityInfo用作here