使用jackson转json解决双向关联循环调用
ITOO V1.0的开发算是告一段落了,现在是整理总结交接环节,在这个项目中常见的问题也该好好整理一下和大家分享了,这次主要介绍转json循环调用的问题。
一、问题背景
相信只要使用ORM映射实体关联关系,实体中存在双向关联的都遇到过这样的问题:
其实这个问题在上次的.NET项目中遇到过,所以这个问题是一个常见问题,只不过因为这次实在java中第一次遇到,但是循环调用的原理还是没有改变的。
二、解决方案
由于刚java项目的经验不丰富,之前实体关系也没有这次项目中的复杂,所以没有解决过,不过学会站在巨人的肩膀上还是解决问题的一个很好的途径,其实这个问题的解决方案有很多种,这里我选择了一种比较好的:
1、首先我们需要引入jackson的jar包:
https://cn.jarfire.org/jackson.all.html
可在这里下载。
2、封装转json的工具类:
- 
package itoo.basic.tool.json;
- 
 
- 
import java.io.PrintWriter;
- 
import javax.servlet.http.HttpServletResponse;
- 
import org.codehaus.jackson.JsonGenerator;
- 
import org.codehaus.jackson.map.ObjectMapper;
- 
 
- 
 
- 
/**
- 
 * 转换json的工具类 
- 
 * @author 陈丽娜
- 
 * @version 1.0.0 , 2014年12月23日 下午3:24:33
- 
 */
- 
public class JacksonJsonUntil{
- 
	public JsonGenerator jsonGenerator=null;
- 
	public ObjectMapper objectMapper=null;
- 
	
- 
	/**
- 
	 * 将对象转换为json字符串
- 
	 * @param response 向前台传递数据时的格式
- 
	 * @param obj 需要转换的对象(可以为list)
- 
	 * @throws Exception 异常处理
- 
	 */
- 
	public void beanToJson(HttpServletResponse response,Object obj) throws Exception{
- 
		response.setContentType("application/json;charset=UTF-8");//防止数据传递乱码
- 
		objectMapper =new ObjectMapper();
- 
		try {
- 
			String json=objectMapper.writeValueAsString(obj);//将对象转成json
- 
			
- 
			PrintWriter out=response.getWriter();//打印到前台
- 
			out.write(json);
- 
		} catch (Exception e) {
- 
			// TODO: handle exception
- 
			e.printStackTrace();
- 
		}
- 
	}
- 
}
3、在多对多关系的实体中加入注解:
这里不再以单个的实体为例,用到的注解是:
(1)排除属性
@JsonIgnore,一般标记在属性或方法上;作用于序列化与反序列化;
@JsonIgnoreProperties,如果是代理类,由于无法标记在属性或方法上,所以,可以标记在类声明上;也作用于反序列化时的字段解析;
还有当使用hibernate的时候,查询数据库后产生的实体类是个代理类,这时候转换JSON会报错;
解决方法有两种:
1)设置FAIL_ON_EMPTY_BEANS属性,告诉Jackson空对象不要抛异常;
mapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
2)使用@JsonIgnoreProperties注解
在实体类声明处加上@JsonIgnoreProperties(value = {"hibernateLazyInitializer","handler"})注解;
建议使用@JsonIgnoreProperties注解,这样生成的JSON中不会产生多余的字段;
三、总结
jackson解决循环调用的问题,只是避开了循环调用,而不是真正的从根本上解决,希望以后可以解决这个问题。
原文地址:https://blog.csdn.net/jly4758/article/details/43085613
使用jackson转json解决双向关联循环调用的更多相关文章
- Json.NET如何避免循环引用
		Json.NET在将对象序列化为Json字符串的时候,如果对象有循环引用的属性或字段,那么会导致Json.NET抛出循环引用异常. 有两种方法可以解决这个问题: 1.在对象循环引用的属性上打上[Jso ... 
- 记一次FastJSON和Jackson解析json时遇到的中括号问题
		版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jadyer/article/details/24395015 完整版见https://jadyer. ... 
- Java进阶知识10 Hibernate一对多_多对一双向关联(Annotation+XML实现)
		本文知识点(目录): 1.Annotation 注解版(只是测试建表) 2.XML版 的实现(只是测试建表) 3.附录(Annotation 注解版CRUD操作)[注解版有个问题:插入值时 ... 
- 在Springboot + Mybaitis-plus 项目中利用Jackson实现json对java多态的(反)序列化
		Jackson允许配置多态类型处理,当JSON面对的转换对象是一个接口.抽象类或者一个基类的时候,可以通过一定配置实现JSON的转换.在实际项目中,Controller层接收入参以及在Dao层将对象以 ... 
- hibernate多对一双向关联
		关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ... 
- hibernate一对一外键双向关联
		关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ... 
- hibernate一对一主键双向关联
		关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ... 
- Hibernate多对多双向关联的配置
		Hibernate的双向多对多关联有两种配置方法:那我们就来看看两种方案是如何配置的. 一.创建以各自类为类型的集合来关联 1.首先我们要在两个实体类(雇员<Emploee>.工程< ... 
- (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)
		上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ... 
随机推荐
- node中__dirname、__filename表示的路径
			__dirname 表示当前文件所在的目录的绝对路径__filename 表示当前文件的绝对路径module.filename ==== __filename 等价process.cwd() 返回运行 ... 
- org.dom4j.Document 解析xml
			1.Java代码 Document doc = DocumentHelper.parseText(xml); // Element rootE = doc.getRootElement(); List ... 
- jquery购物评分
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- Leetcode697.Degree of an Array数组的度
			给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值. 你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度. 示例 1: 输入: [ ... 
- OSI七层模型,作用及其对应的协议
			物理层(Physical Layer):利用传输介质为数据链路层提供物理连接,实现比特流的透明传输 数据链路层(Data Link Layer):负责建立和管理节点间的链路 网络层(Network L ... 
- iPhone开发之深入浅出 (7) — ARC总结
			原文链接:http://www.yifeiyang.net/development-of-the-iphone-simply-7/ 通过前面几篇文章的介绍,我想大家应该对ARC有了一个比较完整的理解. ... 
- 【JZOJ4792】【NOIP2016提高A组模拟9.21】整除
			题目描述 麦克雷有一个1~n的排列,他想知道对于一些区间,有多少对区间内的数(x,y),满足x能被y整除. 输入 第一行包含2个正整数n,m.表示有n个数,m个询问. 接下来一行包含n个正整数,表示麦 ... 
- app被Rejected 的各种原因翻译。这个绝对有用
			1. Terms and conditions(法律与条款) 1.1 As a developer of applications for the App Store you are bound b ... 
- Java练习 SDUT-4303_简单的复数运算(类和对象)
			简单的复数运算(类和对象) Time Limit: 2000 ms Memory Limit: 65536 KiB Problem Description 设计一个类Complex,用于封装对复数的下 ... 
- 实现一个简易的promise
			//promise里面只有三个状态,且三个状态的转换形式有两种 //由pending转换为fulfilled,由pending转换为rejected //Promise的构造函数参数是一个函数,函数的 ... 
