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

一、问题背景

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

其实这个问题在上次的.NET项目中遇到过,所以这个问题是一个常见问题,只不过因为这次实在java中第一次遇到,但是循环调用的原理还是没有改变的。

二、解决方案

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

1、首先我们需要引入jackson的jar包:

https://cn.jarfire.org/jackson.all.html

可在这里下载。

2、封装转json的工具类:


  1. package itoo.basic.tool.json;
  2. import java.io.PrintWriter;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.codehaus.jackson.JsonGenerator;
  5. import org.codehaus.jackson.map.ObjectMapper;
  6. /**
  7. * 转换json的工具类
  8. * @author 陈丽娜
  9. * @version 1.0.0 , 2014年12月23日 下午3:24:33
  10. */
  11. public class JacksonJsonUntil{
  12. public JsonGenerator jsonGenerator=null;
  13. public ObjectMapper objectMapper=null;
  14. /**
  15. * 将对象转换为json字符串
  16. * @param response 向前台传递数据时的格式
  17. * @param obj 需要转换的对象(可以为list)
  18. * @throws Exception 异常处理
  19. */
  20. public void beanToJson(HttpServletResponse response,Object obj) throws Exception{
  21. response.setContentType("application/json;charset=UTF-8");//防止数据传递乱码
  22. objectMapper =new ObjectMapper();
  23. try {
  24. String json=objectMapper.writeValueAsString(obj);//将对象转成json
  25. PrintWriter out=response.getWriter();//打印到前台
  26. out.write(json);
  27. } catch (Exception e) {
  28. // TODO: handle exception
  29. e.printStackTrace();
  30. }
  31. }
  32. }

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解决双向关联循环调用的更多相关文章

  1. Json.NET如何避免循环引用

    Json.NET在将对象序列化为Json字符串的时候,如果对象有循环引用的属性或字段,那么会导致Json.NET抛出循环引用异常. 有两种方法可以解决这个问题: 1.在对象循环引用的属性上打上[Jso ...

  2. 记一次FastJSON和Jackson解析json时遇到的中括号问题

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jadyer/article/details/24395015 完整版见https://jadyer. ...

  3. Java进阶知识10 Hibernate一对多_多对一双向关联(Annotation+XML实现)

    本文知识点(目录): 1.Annotation 注解版(只是测试建表)    2.XML版 的实现(只是测试建表)    3.附录(Annotation 注解版CRUD操作)[注解版有个问题:插入值时 ...

  4. 在Springboot + Mybaitis-plus 项目中利用Jackson实现json对java多态的(反)序列化

    Jackson允许配置多态类型处理,当JSON面对的转换对象是一个接口.抽象类或者一个基类的时候,可以通过一定配置实现JSON的转换.在实际项目中,Controller层接收入参以及在Dao层将对象以 ...

  5. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  6. hibernate一对一外键双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  7. hibernate一对一主键双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  8. Hibernate多对多双向关联的配置

    Hibernate的双向多对多关联有两种配置方法:那我们就来看看两种方案是如何配置的.  一.创建以各自类为类型的集合来关联 1.首先我们要在两个实体类(雇员<Emploee>.工程< ...

  9. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

随机推荐

  1. Session学习小结

    前言: 1.我们在学习一项技术的时候,首先应该是什么时候会用到这项技术.这次学习session也是如此,一般的web项目中都有用户的存在,有用户那么就有了用户的管理,而用户往往是存在于session中 ...

  2. 【JZOJ4461】【GDOI2016模拟4.21】灯塔 分治

    题面 GDOI是一个地处丘陵的小国,为了边防建设,国王希望在国界线上的某一座山峰上建立一座灯塔,照亮整个边界.而灯塔建设的调研工作,就交给了你. GDOI的国境线上有N座连续的山峰,其中第i座的高度是 ...

  3. C++ 实现十大排序算法

    教你手撕排序,这里有一个概念就是稳定排序.假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前, ...

  4. sqlserver 一些基本的语法

    1. STR()函数    这是将数字转换为字符串的快捷函数,这个函数有3个参数:数值,总长度,和小数位   如: select str(123.4,8,4) = 123.4000  如长度不够,则左 ...

  5. python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)

    网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受 与类和实例无绑定关系的function都属于函数(function): 与类和实例有绑定关系的function都属于方法(meth ...

  6. Nginx教程(7) 正向代理与反向代理【总结】 (转)

    1.前言 最近工作中用到反向代理,发现网络代理的玩法还真不少,网络背后有很多需要去学习.而在此之前仅仅使用了过代理软件,曾经为了访问google,使用了代理软件,需要在浏览器中配置代理的地址.我只知道 ...

  7. BZOJ2802Warehouse Store题解

    链接 我太菜了,连贪心题都不会写... 贪心思路很简单,我们能满足顾客就满足他,如果满足不了,就看之前的顾客中 有没有需求比该顾客多的顾客,如果有的话改为卖给这位顾客会使解更优 所以我们用一个优先队列 ...

  8. 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了

    title author date CreateTime categories win10 uwp win2d 入门 看这一篇就够了 lindexi 2019-5-25 20:0:52 +0800 2 ...

  9. phpexcel导出数据库成excel文件

    <?php error_reporting(E_ALL); date_default_timezone_set('Europe/London'); /** PHPExcel */ require ...

  10. Android BroadcastReceiver 简介

    Android BroadcastReceiver 简介  在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver     活动(A ...