gpt4 book ai didi

java - org.codehaus.jackson.map.JsonMappingException : Infinite recursion (StackOverflowError)

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:48:37 25 4
gpt4 key购买 nike

我正在尝试一些非常基本的网络服务。每次尝试返回 Prtnr 对象时都会出现此异常。

Uncaught exception thrown in one of the service methods of the servlet: spitter. Exception thrown : 
org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError)
(through reference chain: org.hibernate.collection.PersistentSet[0]->org.abc.dvo.PrtnrGeoInfo["id"]->org.abc.dvo.PrtnrGeoInfoId["partner"]->
org.abc.dvo.Prtnr["prtnrGeoInfos"]->org.hibernate.collection.PersistentSet[0]->org.abc.dvo.PrtnrGeoInfo["id"]->org.abc.dvo.PrtnrGeoInfoId["partner"]->
org.abc.dvo.Prtnr["prtnrGeoInfos"]->org.hibernate.collection.PersistentSet[0]->org.abc.dvo.PrtnrGeoInfo["id"]->org.abc.dvo.PrtnrGeoInfoId["partner"]->
org.abc.dvo.Prtnr["prtnrGeoInfos"]->org.hibernate.collection.PersistentSet[0]->org.abc.dvo.PrtnrGeoInfo["id"]->org.abc.dvo.PrtnrGeoInfoId["partner"]->
...
at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:164)
at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)
at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446)
at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)
...

Prtnr 类是:

public class Prtnr implements Cloneable, java.io.Serializable {

private static final long serialVersionUID = 201207021420600052L;
private Integer prtnrId;
private String creatUserId;
private Date creatTs;
private String updtUserId;
private Date updtTs;
private String prtnrNm;
private Integer cncilNum;
private Character prtnrTypCd;
private Set<PrtnrGeoInfo> prtnrGeoInfos = new HashSet<PrtnrGeoInfo>(0);
private Set<PrtnrDtl> prtnrDtls = new HashSet<PrtnrDtl>(0);
private Set<SuplyDtl> suplyDtls = new HashSet<SuplyDtl>(0);
private Set<TrnsprtDtl> trnsprtDtls = new HashSet<TrnsprtDtl>(0);
private Set<PrtnrFacil> prtnrFacils = new HashSet<PrtnrFacil>(0);
private Set<PrtnrHumanResrc> prtnrHumanResrcs = new HashSet<PrtnrHumanResrc>(0);
.....
.....
Getters and setters for these properties
...
}

PrtnrGeoInfo 类是:

public class PrtnrGeoInfo implements java.io.Serializable {
private PrtnrGeoInfoId id = new PrtnrGeoInfoId();
private String creatUserId;
private Date creatTs;
private String updtUserId;
private Date updtTs;

Getters and setters for these properties

}

PrtnrGeoInfoId 类是:

public class PrtnrGeoInfoId implements java.io.Serializable {   
private Prtnr partner;
private GeoSegment geoSegment;
private static final long serialVersionUID = 201207060857580050L;

Getters and setters for these properties
}

我相信这是因为类相互引用。但是这个问题怎么解决。在 Struts 2 和 Spring 应用程序中,这个对象可以顺利通过。

Controller 类如下:

@Controller
@RequestMapping("/partners")
public class PartnerController {
@RequestMapping(value="/{id}", method=RequestMethod.GET, headers ={"Accept=text/xml,application/json"})
@ResponseBody
public Prtnr getPartner(@PathVariable("id") String id) throws Exception{
Prtnr partner = null;
try{
partner = partnerService.getPartnerById(Integer.valueOf(id));
System.out.println("******* Test message " );
}catch(Exception ex){
System.out.println("******* Exception thrown ... " + ex.getMessage());
}

return partner;
}
}

调用类是 公共(public)类测试模板 {

    private static final long serialVersionUID = 1130201273334264152L;
public static void main(String[] args){
Prtnr partner = (Prtnr)new RestTemplate().getForObject("http://localhost:9080/respondersApp/testWs/partners/{id}", Prtnr.class, "1");
System.out.println("partner name is : " + partner.getPrtnrNm());
}
}

最佳答案

在此link你可以找到解决这个问题的方法。

但是下面我将在实践中粘贴解决方案。

非常简单。假设您的数据库查询在没有 JSON 的情况下也能正常工作,您所要做的就是:

添加 @JsonManagedReference 在关系的前向部分(即 User.java 类):

@Entity
public class User implements java.io.Serializable{

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;

@Column(name="name")
private String name;

@ManyToMany
@JoinTable(name="users_roles",joinColumns=@JoinColumn(name = "user_fk"),
inverseJoinColumns=@JoinColumn(name = "role_fk"))
@JsonManagedReference
private Set<Role> roles = new HashSet<Role>();

...

添加 @JsonBackReference 在关系的后面部分(即 Role.java 类):

@Entity
public class Role implements java.io.Serializable {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

@ManyToMany(mappedBy="roles")
@JsonBackReference
private Set<User> users = new HashSet<User>();

...

工作完成。如果您查看您的 Firebug 日志,您会注意到无限递归循环已经消失。

关于java - org.codehaus.jackson.map.JsonMappingException : Infinite recursion (StackOverflowError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14281541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com