java - Spring Boot - Jackson 在使用列表字段时无法 POST/PUT (@ManyToMany)

标签 java spring rest spring-boot jackson

说明

我编写了一个示例代码来测试 http 方法,令我惊讶的是,当我尝试将 JSON 转换为列表字段上的对象时,我发现了一个问题,它崩溃了,但是一旦我删除该字段,一切都会正常。

<小时/>

示例结构 (本示例中跳过了 id 等字段)

{
    "name": "One",
    "child": {
        "name": "Two",
        "nested": [
            {
                "name": "Three"
            }
        ]
    }
}
<小时/>

预期

能够POSTPUT,此时会抛出错误。

实际

我收到错误,但是一旦删除该嵌套字段,一切都会正常工作,GETDELETE也可以正常工作其中有嵌套字段。

抛出错误

无法评估类型 [[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 是唯一具有该注释的人,另外两个(ChildNested 只是使用 @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/

相关文章:

java - 加密/解密单元测试

java - 沿着螺旋线移动到中心,笛卡尔坐标在开始时给出

java - 使用 ehcache 缓存 java.util.Map

java - 无法成功将字符串值 "$10.55"作为 spring 路径变量传递

java - 如何在 Spring MVC 中定义请求映射的优先级?

java - 如何保护java应用程序中的凭据

eclipse - 如何在 Windows 上安装多个 JDK?

java - 尝试使用 java 写入读取和写入文件,导致输出文件为空

java - JPA 命名查询显示错误

java - 与 jersey json REST 客户端共享对象