说明
我编写了一个示例代码来测试 http 方法,令我惊讶的是,当我尝试将 JSON 转换为列表字段上的对象时,我发现了一个问题,它崩溃了,但是一旦我删除该字段,一切都会正常。
<小时/>示例结构 (本示例中跳过了 id 等字段)
{
"name": "One",
"child": {
"name": "Two",
"nested": [
{
"name": "Three"
}
]
}
}
<小时/>
预期
能够POST和PUT,此时会抛出错误。
实际
我收到错误,但是一旦删除该嵌套字段,一切都会正常工作,GET和DELETE也可以正常工作其中有嵌套字段。
抛出错误
无法评估类型 [[simple type, class com.base.project.Parent]] 的 Jackson 反序列化:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法处理托管/返回引用“defaultReference”:反向引用类型(java.util.List)与托管类型(com.base.project.Child)不兼容
<小时/>我将跳过一些字段,这样就不会成为集群
<小时/>class Parent (顶层,在顶部显示的结构中具有名称One)
@JsonManagedReference // I already tried removing this
@OneToOne(mappedBy = "parent", cascade {...})
private Child child;
class Child (中间层,在顶部显示的结构中具有名称Two)
@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;
<小时/>
我尝试过的事情
- 删除@JsonManagedReference
- 向三个类添加了@JsonIdentityInfo
- 在关系字段上使用@JsonProperty
- 删除嵌套字段(@ManyToMany),然后就可以正常工作了
最佳答案
所描述的原始问题
解决方案是删除除顶层之外的所有 @JsonManagedReference
,因此在我的示例中 Parent 是唯一具有该注释的人,另外两个(Child 和 Nested 只是使用 @JsonBackReference
)
请注意,我知道 Child 类几乎是 Nested 类的“父级”,但是,添加 @JsonManagedReference
它抛出了一个错误,因此,出于某种原因,顶层是唯一需要它的层。
这仅修复了POST方法。
<小时/>第二个问题,PUT 方法没有检测到任何子进程的 ID
在 JSON 正文中提供 id 会引发错误,但是在删除 id 字段后就一切正常了(尽管出于明显的原因我无法做到这一点)不要在数据库上更新它们)
我在三个类的顶部设置了以下内容
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
(id 是我的类中存储... id 的字段的名称)
不要引用我的话,但我相信在 @JsonManagedReference
和 @JsonBackReference
上使用该注释会导致某种问题在 PUT 方法中,POST 没有受到任何影响。
不用说,当我删除 @JsonIdentityInfo
而保留其他两个时,问题就解决了。
这修复了 PUT 方法。
关于java - Spring Boot - Jackson 在使用列表字段时无法 POST/PUT (@ManyToMany),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60068823/