org.codehaus.jackson.map.JsonMappingException: Infinite recursion的解决

错误日志:

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;

}






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值