解决jpa和hibernate的json序列化死循环问题

在jpa和hibernate的一对多和多对多查询的时候,常常会出现死循环的情况。

出现这种情况主要是在json序列化的时候,出现循环引用的情况,与后台查询的语句无关。所以只要在json序列化的时候,进行处理就可以了。

本文使用json工具进行处理序列化问题:

package bos.utils;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

import java.util.List;


public class JsonUtils {

    //strings序列化出现循环引用的字段
	public static String objecttojson(Object object,String[] strings) {
		JsonConfig jsonConfig=new JsonConfig();
		jsonConfig.setExcludes(strings);
		JSONObject fromObject = JSONObject.fromObject(object, jsonConfig);
		String json=fromObject.toString();
		return json;
	}
	public static String arraytojson(List list,String[] strings ){
		JsonConfig jsonConfig=new JsonConfig();
		jsonConfig.setExcludes(strings);
		JSONArray fromObject = JSONArray.fromObject(list,jsonConfig);
		String json=fromObject.toString();
		return json;
	}
}

 

处理之前的处理代码和结果

   @RequestMapping("/list")
    @ResponseBody
    public PageBean list(int page, int rows){
        Pageable pageable= PageRequest.of(page-1,rows);
        Page<Function> rolePage = functionService.findAll(pageable);
        PageBean pageBean=new PageBean();
        pageBean.setCurrentPage(page);
        pageBean.setPageSize(rows);
        pageBean.setTotal((int) functionService.count());
        pageBean.setRows(rolePage.getContent());
        //防止出现死循环
//        String objecttojson = JsonUtils.objecttojson(pageBean, new String[]{"roles","parentFunction","children"});
//        return objecttojson;
        return pageBean;
    }

出现错误:

 

修改后代码:

    @RequestMapping("/list")
    @ResponseBody
    public String list(int page, int rows){
        Pageable pageable= PageRequest.of(page-1,rows);
        Page<Function> rolePage = functionService.findAll(pageable);
        PageBean pageBean=new PageBean();
        pageBean.setCurrentPage(page);
        pageBean.setPageSize(rows);
        pageBean.setTotal((int) functionService.count());
        pageBean.setRows(rolePage.getContent());
        //防止出现死循环
        String objecttojson = JsonUtils.objecttojson(pageBean, new String[]{"roles","parentFunction","children"});
        return objecttojson;
//        return pageBean;
    }

处理结果:

 

总结:对于多对对和一对多的双方关联,会出现循环引用的情况。解决方法基本如下

  1. 将双方关联改成一方关联也能解决死循环的问题,但是这种方法不太推荐
  2. 采用本文的方法,在序列化之前剔除循环引用的字段
  3. 使用@JsonIgnoreProperties注解进行解决,本人尝试过好像不太行,如果有小伙伴会的话,可以联系我。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值