使用jackson转json解决双向关联循环调用

原文连接:http://www.faceye.net/search/142672.htmlhtml

ITOO V1.0的开发算是告一段落了,如今是整理总结交接环节,在这个项目中常见的问题也该好好整理一下和你们分享了,此次主要介绍转json循环调用的问题。java

1、问题背景

相信只要使用ORM映射实体关联关系,实体中存在双向关联的都遇到过这样的问题:数据库


其实这个问题在上次的.NET项目中遇到过,因此这个问题是一个常见问题,只不过由于此次实在java中第一次遇到,可是循环调用的原理仍是没有改变的。json

2、解决方案

因为刚java项目的经验不丰富,以前实体关系也没有此次项目中的复杂,因此没有解决过,不过学会站在巨人的肩膀上仍是解决问题的一个很好的途径,其实这个问题的解决方案有不少种,这里我选择了一种比较好的:app

1、首先咱们须要引入jacksonjar包:工具

可在这里下载。spa

2、封装转json的工具类:.net

package itoo.basic.tool.json;
import .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、在多对多关系的实体中加入注解:hibernate

这里再也不以单个的实体为例,用到的注解是:代理

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中不会产生多余的字段;

3、总结

jackson解决循环调用的问题,只是避开了循环调用,而不是真正的从根本上解决,但愿之后能够解决这个问题。

原文连接:http://www.faceye.net/search/142672.html

相关文章
相关标签/搜索