Java Spring Boot-Jackson在使用列表字段(@ManyToMany)时无法发布/放置
解释 我制作了一个测试http方法的示例代码,令我惊讶的是,我在尝试将JSON转换为列表字段上的对象时发现了一个问题,它崩溃了,但只要我删除该字段,一切都正常Java Spring Boot-Jackson在使用列表字段(@ManyToMany)时无法发布/放置,java,spring,rest,spring-boot,jackson,Java,Spring,Rest,Spring Boot,Jackson,解释 我制作了一个测试http方法的示例代码,令我惊讶的是,我在尝试将JSON转换为列表字段上的对象时发现了一个问题,它崩溃了,但只要我删除该字段,一切都正常 示例结构(本例跳过了id等字段) 预期的 能够POST和PUT,此时会抛出错误 实际值 我得到了一个错误,但是一旦我删除了嵌套的字段,一切都可以正常工作,get和delete即使在嵌套的字段中也可以正常工作 抛出错误 无法评估类型[[简单类型,类com.base.project.Parent]]的Jackson反序列化:com.fas
示例结构(本例跳过了id等字段)
预期的 能够POST和PUT,此时会抛出错误 实际值 我得到了一个错误,但是一旦我删除了嵌套的字段,一切都可以正常工作,get和delete即使在嵌套的字段中也可以正常工作 抛出错误 无法评估类型[[简单类型,类com.base.project.Parent]]的Jackson反序列化:com.fasterxml.Jackson.databind.exc.InvalidDefinitionException:无法处理托管/反向引用“defaultReference”:反向引用类型(java.util.List)与托管类型不兼容(com.base.project.Child)
我将跳过一些字段,这样就不会成为集群
类父级(顶层在顶部显示的结构中具有名称One) class Child(中间层的名称为Two,结构如顶部所示)
@JsonBackReference
@OneToOne(级联={…})
@JoinColumn(name=“parent\u id”)
私人家长;
@JsonManagedReference//我已经尝试删除这个
@ManyToMany(mappedBy=“child”,cascade={…})
私有列表嵌套;
类嵌套(底层在顶部显示的结构中具有名称Three)
@JsonBackReference
@多个(级联={…})
@可接合(…)
私人名单儿童;
我尝试过的事情
- 正在删除@JsonManagedReference
- 将@JsonIdentityInfo添加到三个类中
- 在关系字段上使用@JsonProperty
- 删除嵌套的
如前所述的原始问题 解决方案是除去顶层的
@JsonManagedReference
之外的任何@JsonManagedReference
,因此在我的示例中,Parent是唯一具有该注释的,其他两个(Child和Nested只是使用@JsonBackReference
)
注意,我知道子类几乎是嵌套的类的“父类”,但是,向其添加@JsonManagedReference
会引发错误,因此出于某种原因,顶层是唯一需要它的层
这只修复了POST方法
第二个问题,PUT方法没有检测到来自任何孩子的id 在JSON正文中提供id会抛出一个错误,但是在删除id字段后,一切正常(尽管由于明显的原因,我无法在数据库中更新它们) 在我的三门课中,我把以下几点列在了第一位
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
(id是我的类中存储…id的字段的名称)
请不要在这方面引用我的话,但我相信在@JsonManagedReference
和@JsonBackReference
中添加注释会在PUT方法中造成某种问题,POST不会受到任何影响
不用说,只要我删除了@JsonIdentityInfo
,而剩下的两个就解决了这个问题
这修复了PUT方法
@JsonManagedReference // I already tried removing this
@OneToOne(mappedBy = "parent", cascade {...})
private Child child;
@JsonBackReference
@OneToOne(cascade = {...})
@JoinColumn(name = "parent_id")
private Parent parent;
@JsonManagedReference // I already tried removing this
@ManyToMany(mappedBy = "child", cascade = {...})
private List<Nested> nested;
@JsonBackReference
@ManyToMany(cascade = {...})
@JoinTable(...)
private List<Child> child;
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")