Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot-Jackson在使用列表字段(@ManyToMany)时无法发布/放置_Java_Spring_Rest_Spring Boot_Jackson - Fatal编程技术网

Java Spring Boot-Jackson在使用列表字段(@ManyToMany)时无法发布/放置

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

解释

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


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


预期的

能够POSTPUT,此时会抛出错误

实际值

我得到了一个错误,但是一旦我删除了嵌套的字段,一切都可以正常工作,getdelete即使在嵌套的字段中也可以正常工作

抛出错误

无法评估类型[[简单类型,类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
  • 删除嵌套的字段(@ManyToMany),然后它就可以正常工作了

如前所述的原始问题

解决方案是除去顶层的
@JsonManagedReference
之外的任何
@JsonManagedReference
,因此在我的示例中,Parent是唯一具有该注释的,其他两个(ChildNested只是使用
@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")