@JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties

jackson中的@JsonBackReference和@JsonManagedReference,以及@JsonIgnore均是为了解决对象中存在双向引用导致的无限递归(infinite recursion)问题。这些标注均可用在属性或对应的get、set方法中。

@JsonBackReference和@JsonManagedReference:这两个标注通常配对使用,通常用在父子关系中。@JsonBackReference标注的属性在序列化(serialization,即将对象转换为json数据)时,会被忽略(即结果中的json数据不包含该属性的内容)。@JsonManagedReference标注的属性则会被序列化。在序列化时,@JsonBackReference的作用相当于@JsonIgnore,此时可以没有@JsonManagedReference。但在反序列化(deserialization,即json数据转换为对象)时,如果没有@JsonManagedReference,则不会自动注入@JsonBackReference标注的属性(被忽略的父或子);如果有@JsonManagedReference,则会自动注入自动注入@JsonBackReference标注的属性。

@JsonIgnore:直接忽略某个属性,以断开无限递归,序列化或反序列化均忽略。当然如果标注在get、set方法中,则可以分开控制,序列化对应的是get方法,反序列化对应的是set方法。在父子关系中,当反序列化时,@JsonIgnore不会自动注入被忽略的属性值(父或子),这是它跟@JsonBackReference和@JsonManagedReference最大的区别。

@JsonIgnoreProperties 用法

  1. //忽略parent models属性
  2. @JsonIgnoreProperties({"parent","models"})
  3. public class Module{
  4. @OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE)
  5. public java.util.List<Module> models;
  6. @ManyToOne(fetch=FetchType.LAZY)
  7. @JoinColumn(name="parent_id",referencedColumnName="id")
  8. public Module parent;
  9. }


@JsonFilter用法

  1. //忽略parent models属性
  2. @JsonFilter("module")
  3. public class Module{
  4. @OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE)
  5. public java.util.List<Module> models;
  6. @ManyToOne(fetch=FetchType.LAZY)
  7. @JoinColumn(name="parent_id",referencedColumnName="id")
  8. public Module parent;
  9. }
  1. 测试代码:
  2. Module module=moduleService.findModuleByName("文件管理");
  3. ObjectMapper mapper=new ObjectMapper();
  4. FilterProvider filterProvider=new SimpleFilterProvider().addFilter("module", SimpleBeanPropertyFilter.serializeAllExcept("parent","models"));
  5. mapper.setFilters(filterProvider);
  6. String resultString=mapper.writeValueAsString(module);


JsonFilter可以动态指定过滤的属性,缺点:每次转换都要设置过滤器,否则会报错,就这点很不爽。既然不爽就换种方式过滤,使用fastjson,请看下面的代码:

  1. package com.company.project.common.util;
  2. import java.util.Map;
  3. import java.util.Map.Entry;
  4. import java.util.Set;
  5. import com.alibaba.fastjson.JSON;
  6. import com.alibaba.fastjson.serializer.JSONSerializer;
  7. import com.alibaba.fastjson.serializer.PropertyFilter;
  8. import com.alibaba.fastjson.serializer.SerializeWriter;
  9. import com.alibaba.fastjson.serializer.SerializerFeature;
  10. public class JsonHelpler {
  11. public static String toJSON(Object o){
  12. return JSON.toJSONString(o,SerializerFeature.WriteMapNullValue);
  13. }
  14. public static SerializeWriter toJSON(Object obj, final Map<Class<?>, Set<String>> includeMap){
  15. PropertyFilter filter = new PropertyFilter() {
  16. @Override
  17. public boolean apply(Object source, String name, Object value) {
  18. for(Entry<Class<?>, Set<String>> entry : includeMap.entrySet()) {
  19. Class<?> class1 = entry.getKey();
  20. if(source.getClass() == class1){
  21. Set<String> fields = entry.getValue();
  22. for(String field : fields) {
  23. if(field.equals(name)){
  24. return false;
  25. }
  26. }
  27. }
  28. }
  29. return true;
  30. } };
  31. SerializeWriter sw = new SerializeWriter();
  32. JSONSerializer serializer = new JSONSerializer(sw);
  33. serializer.getPropertyFilters().add(filter);
  34. serializer.write(obj);
  35. return sw;
  36. }
  37. }
  38. 测试代码
  39. Map<Class<?>, Set<String>> includeMap =  new HashMap<Class<?>, Set<String>>();
  40. Set<String> set = new HashSet<String>();
  41. set.add("parent");
  42. set.add("models");
  43. includeMap.put(Module.class, set);
  44. SerializeWriter resultString=JsonHelpler.toJSON(module, includeMap);
  45. System.out.println(resultString);

hibernate懒加载导致jackjson解析json时StackOverFlow的更多相关文章

  1. Hibernate懒加载导致json数据对象传输异常的问题---(非常重要)

    1. 异常: [console_demo][WARN] [2016-12-15 19:49:35] org.springframework.web.servlet.mvc.support.Defaul ...

  2. Hibernate懒加载解析

    Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来 ...

  3. -java转json hibernate懒加载造成的无限递归问题

    1.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系. JoinColumn(name="pid") 2. 在保存数据时,总是先保存的 ...

  4. hibernate懒加载(转载)

    http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下 ...

  5. hibernate懒加载

    Hibernate懒加载解析 hibernatejoinsession数据库sqlobject Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适 ...

  6. Hibernate懒加载深入分析

    Hibernate懒加载深入分析 懒加载可以提高性能吗?  不可以简单的说"能",因为Hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越. ...

  7. 关于s2sh框架关于hibernate懒加载问题的说明和解决方案

    首先我们来看下面这个图,解释了一个web程序的一次请求流程! 懒加载异常的说明: 懒加载就是我们在查询一个对象时,它所有的属性是否要被查出来! 如果懒加载开启的话,session在service层就被 ...

  8. Hibernate懒加载的三种解决方案

    Hibernate懒加载的两种解决方案: 1.Hibernate.initialize(代理对象) 2.在*.hbm.xml映射文件中添加lazy="false"属性 3.使用op ...

  9. 关于Hibernate懒加载问题的最终解决方案

    看到一篇Hibernate懒加载的文章,所以转载,原地址如下: http://tuoxie007.iteye.com/blog/334853 Hibernate的强大之处之一是懒加载功能,可以有效的降 ...

随机推荐

  1. iOS开发——自定义转场动画

    首先是UIPresentationController,这个控制器给modal新的viewController提供了下一步的view和转场的管理,从一个viewController被modal出来到被 ...

  2. 百度定位一直出现4.9E -324的问题解决方法

    问题:华为mate10一直在申请百度定位的时候出现此问题并且定位权限和定位服务都打开的情况也是返回这个参数 明显没有定位成功,其他手机暂时没有出现(只要打开定位权限就会立即定位成功) 解决:在定位之前 ...

  3. spring中aop的注解实现方式简单实例

    上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们主要分为如下几个步骤(自己整理的,有更好的方法的 ...

  4. JS 装饰器解析

    随着 ES6 和 TypeScript 中类的引入,在某些场景需要在不改变原有类和类属性的基础上扩展些功能,这也是装饰器出现的原因. 装饰器简介 作为一种可以动态增删功能模块的模式(比如 redux ...

  5. WordPress二级菜单设置

    关于二级菜单的设置,首先建立几个自己的分类目录,然后打开菜单设置界面,用鼠标自由拖动即可.注意,这里说的一级菜单和二级菜单都是分类目录,所 以我们写文章的时候应该同时选择一级菜单和二级菜单两个分类目录 ...

  6. 在VMWare上安装Arch Linux

    1.为什么选择Arch Linux Arch Linux 是通用 x86-64 GNU/Linux 发行版.Arch采用滚动升级模式,尽全力提供最新的稳定版软件.初始安装的Arch只是一个基本系统,随 ...

  7. 部署wcf出现的问题与解决方法

    我将本机作为服务器开发时,没出什么问题,将wcf服务端寄缩到另一台电脑上时,出现了一些问题,这里总结下: 1.wcf服务器和另一个网站应用出问题 服务器的iis上有一个网站应用,当我将wcf服务寄缩到 ...

  8. 【Java一看就懂】浅克隆和深克隆

    一.何为克隆 在Java的体系中,数据类型分为基本数据类型和引用数据类型. 基本数据类型包括byte,short,int,long,float,double,boolean,char 8种,其克隆可通 ...

  9. 微信小程序学习笔记(阶段一)

    一阶段学习过程: (一)看官方文档的简易教程:https://mp.weixin.qq.com/debug/wxadoc/dev/ (二)看小码哥视频:https://chuanke.baidu.co ...

  10. 使用mescroll来实现移动端页面上拉刷新, 下拉加载更多功能

    * mescroll请参考官方文档 1. 使用mescroll实现下拉滑动的效果: (仅仅效果, 有的页面不需要刷新数据, 只要你能下拉就行) 代码如下: var mescroll = new MeS ...