错误日志:
java.lang.IllegalArgumentException: org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: com.tcd.company.entity.CompanyBasicFee["company"]->com.tcd.company.entity.Company["companyBasicFees"]->org.hibernate.collection.PersistentBag[0]
at com.tcd.common.utils.web.struts2.Struts2Utils.renderJson(Struts2Utils.java:95)
at com.tcd.company.web.CompanyAction.seleCompany(CompanyAction.java:165)
这个错是什么错呢? 原因是 :实现对象的序列化和反序列化时用到了Jackson,根据infinite recursion知道是无线递归错误导致了堆栈溢出。。
实体类Company内包含了CompanyBasic的对象集合List<CompanyBasic>companybasic,而实体类CompanyBasic内也含有Company对象,而Company和CompanyBasic是一对多双向关联的关系,在Jackson序列化List<CompanyBasic>属性时会无循环下去,导致stackoverflow
部分代码如下:
import org.codehaus.jackson.map.ObjectMapper;
public class Struts2Utils {
private static ObjectMapper mapper = new ObjectMapper();
public static void renderJson(final Object data, final String... headers)
public static void renderJson(Object data, String[] headers) {
HttpServletResponse response = initResponseHeader("application/json", headers);
try {
mapper.writeValue(response.getWriter(), data);
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
}
}
实体类简单写一下:
public calss Company{
private String id;
private List<CompanyBasic> companyBasic;
}
public class CompanyBasic{
private String companyId;
private Company company;
}
@Action(value="seleCompany")
public void seleCompany() throws Exception{
companys = (companyManager.getCompanybyName(companyName1));
Struts2Utils.renderJson(companys);
} 此方法在运行之后就会报错
解决方法:
1. 实体类Company上加入 @JsonIgnoreProperties(value={""}),value内为要忽略的属性集
2.实体类Conpany的 属性或方法上加入注释@JsonIgnore
如:
@JsonIgnoreProperties(value={"companyBasic"})
public calss Company{
private String id;
@JsonIgnore
private List<CompanyBasic> companyBasic;
}