昨天调试一段代码,代码的大概意思是有一个对象A,A中有一个属性list,需要将查询到结果(包括A) 放到list中,然后返回给前台,
debug的时候一路畅通,但是return结果集的时候报错栈溢出
先看下问题代码:
List<WechatCirculation> tmpResultList = new ArrayList<>(list.size());
list.forEach(tmp ->{
if(CollUtil.isNotEmpty(tmp)){
WechatCirculation wechatCirculation = tmp.get(0);
wechatCirculation.setCount(tmp.size());
tmpResultList.add(wechatCirculation);
}
});
LogFactory.get().info("tmpResultList==>",tmpResultList);
//二审退回
if(circulationType == 3 && Objects.equals("2",dict.getAttrVal())){
tmpResultList.forEach(tmp ->{
//这里直接将原来的对象查出来的对象放入list属性中 list中对象的内存地址和最外层对象的内存地址是一致的转为json的时候回造成死循环--->栈溢出
List<WechatCirculation> wechatCirculations
= wechatCirculationList.stream().filter(s->s.getTakerOrgId().equals(tmp.getTakerOrgId())).collect(Collectors.toList());
tmp.setList(wechatCirculations);
});
}
出现问题就是在这里 因为tmp对象的属性list中的集合对象里包含 tmp对象
放入集合中的时候是没有问题的,但是序列化时 就会造成循环引用 最终导致栈溢出
改进后的代码:
List<WechatCirculation> tmpResultList = new ArrayList<>(list.size());
list.forEach(tmp ->{
if(CollUtil.isNotEmpty(tmp)){
WechatCirculation wechatCirculation = tmp.get(0);
wechatCirculation.setCount(tmp.size());
tmpResultList.add(wechatCirculation);
}
});
LogFactory.get().info("tmpResultList==>",tmpResultList);
//二审退回
if(circulationType == 3 && Objects.equals("2",dict.getAttrVal())){
tmpResultList.forEach(tmp ->{
//这里直接将原来的对象查出来的对象放入list属性中 list中对象的内存地址和最外层对象的内存地址是一致的转为json的时候回造成死循环--->栈溢出
List<WechatCirculation> wechatCirculations
= wechatCirculationList.stream().filter(s->s.getTakerOrgId().equals(tmp.getTakerOrgId())).collect(Collectors.toList());
List<WechatCirculation> newWechatCirculations=new ArrayList<>();
//更改对象的内存地址
for (WechatCirculation wechatCirculation:wechatCirculations){
WechatCirculation newWechatCirculation=new WechatCirculation();
BeanUtil.copyProperties(wechatCirculation,newWechatCirculation);
newWechatCirculations.add(newWechatCirculation);
}
tmp.setList(newWechatCirculations);
});
}
对象重新赋值 并进行值拷贝 最终不报错