SpringBoot - 切换杰克逊参考多对一关系

时间:2017-07-20 10:15:33

标签: java spring spring-boot jackson one-to-many

我有一个运行良好的springboot应用程序。在其中,我有2个实体,Project和Affectation,具有多对一的关系。一个项目可以有很多做法,但一个做法只能有一个项目。我在“很多”上设置@JsonBackReference,在孤独的一个上设置@JsonManagedReference。 GET / POST请求运行良好。

问题:

目前,当我获得一个项目时,我会收到与该项目相关联的影响,当我得到一个影响时,我没有关于该链接项目的信息。

我想反过来。 我希望当我得到一个矫揉造作时,我会收到链接的项目。为此,我切换了@jsonBackReference@JsonManagedReference

@Entity
@Table(name="Projet")
public class Projet{
...
    @OneToMany(mappedBy = "project")
    @JsonBackReference (value="project-affectation")
    @Cascade(value = { CascadeType.DELETE, CascadeType.SAVE_UPDATE })
    private Set<Affectation> affectations = new HashSet<Affectation>();
...
}



@Entity
@Table(name="Affectation")
public class Affectation{
...
    @ManyToOne
    @JoinColumn (name="projectid")
    @JsonManagedReference (value="project-affectation")
    private Project project;
...
}

使用此代码,GET请求很好,我收到了我想要的内容。但是POST一个项目不再起作用了:

  

无法为类型[[simple type,class com.open.chargeplan.entities.Project]]评估Jackson反序列化:java.lang.IllegalArgumentException:无法处理托管/后向引用'project-affectation':后引用类型(java.util.Set)与托管类型不兼容(com.open.chargeplan.entities.Affectation)

这是我在projectController.java中的POST方式:

@RequestMapping(method = RequestMethod.POST, path="/add")
public ProjectResponse addNewProjet(@RequestBody Project project){
    projetRepository.save(project);
    return new ProjectResponse(ProjectResponse.Status.OK, project);
}

这就是我要发布的内容:

  

curl -i -X POST -H'Content-Type:application / json'-d'{“projectid”:   “7A93154537”,“name”:“projectTest”,“customer”:“customerTest”,   “description”:“这是一个测试”}“http://localhost:8081/project/add

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

我通过删除@JsonManagedReference但保留@JsonBackReference来解决问题。