jackson java转json hibernate懒加载造成的无限递归问题
@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 用法
-
//忽略parent models属性
-
@JsonIgnoreProperties({"parent","models"})
-
public class Module{
-
@OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE)
-
public java.util.List<Module> models;
-
-
@ManyToOne(fetch=FetchType.LAZY)
-
@JoinColumn(name="parent_id",referencedColumnName="id")
-
public Module parent;
-
}
@JsonFilter用法
-
//忽略parent models属性
-
@JsonFilter("module")
-
public class Module{
-
@OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE)
-
public java.util.List<Module> models;
-
-
@ManyToOne(fetch=FetchType.LAZY)
-
@JoinColumn(name="parent_id",referencedColumnName="id")
-
public Module parent;
-
}
-
测试代码:
-
Module module=moduleService.findModuleByName("文件管理");
-
ObjectMapper mapper=new ObjectMapper();
-
FilterProvider filterProvider=new SimpleFilterProvider().addFilter("module", SimpleBeanPropertyFilter.serializeAllExcept("parent","models"));
-
mapper.setFilters(filterProvider);
-
String resultString=mapper.writeValueAsString(module);
JsonFilter可以动态指定过滤的属性,缺点:每次转换都要设置过滤器,否则会报错,就这点很不爽。既然不爽就换种方式过滤,使用fastjson,请看下面的代码:
-
package com.company.project.common.util;
-
-
import java.util.Map;
-
import java.util.Map.Entry;
-
import java.util.Set;
-
-
import com.alibaba.fastjson.JSON;
-
import com.alibaba.fastjson.serializer.JSONSerializer;
-
import com.alibaba.fastjson.serializer.PropertyFilter;
-
import com.alibaba.fastjson.serializer.SerializeWriter;
-
import com.alibaba.fastjson.serializer.SerializerFeature;
-
-
public class JsonHelpler {
-
-
public static String toJSON(Object o){
-
return JSON.toJSONString(o,SerializerFeature.WriteMapNullValue);
-
}
-
-
public static SerializeWriter toJSON(Object obj, final Map<Class<?>, Set<String>> includeMap){
-
PropertyFilter filter = new PropertyFilter() {
-
@Override
-
public boolean apply(Object source, String name, Object value) {
-
for(Entry<Class<?>, Set<String>> entry : includeMap.entrySet()) {
-
Class<?> class1 = entry.getKey();
-
if(source.getClass() == class1){
-
Set<String> fields = entry.getValue();
-
for(String field : fields) {
-
if(field.equals(name)){
-
return false;
-
}
-
}
-
}
-
}
-
return true;
-
} };
-
SerializeWriter sw = new SerializeWriter();
-
JSONSerializer serializer = new JSONSerializer(sw);
-
serializer.getPropertyFilters().add(filter);
-
serializer.write(obj);
-
return sw;
-
}
-
-
}
-
-
测试代码
-
Map<Class<?>, Set<String>> includeMap = new HashMap<Class<?>, Set<String>>();
-
Set<String> set = new HashSet<String>();
-
set.add("parent");
-
set.add("models");
-
includeMap.put(Module.class, set);
-
SerializeWriter resultString=JsonHelpler.toJSON(module, includeMap);
-
System.out.println(resultString);
原文地址:https://blog.csdn.net/cym19890801/article/details/49660105
jackson java转json hibernate懒加载造成的无限递归问题的更多相关文章
- -java转json hibernate懒加载造成的无限递归问题
1.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系. JoinColumn(name="pid") 2. 在保存数据时,总是先保存的 ...
- Hibernate懒加载导致json数据对象传输异常的问题---(非常重要)
1. 异常: [console_demo][WARN] [2016-12-15 19:49:35] org.springframework.web.servlet.mvc.support.Defaul ...
- json序列化懒加载问题
如果框架使用了json序列化对象,当配置了hibernate懒加载时,可能会抛出异常,或者出现N+1的问题,或者出现无限循环的问题.网上很多解决方案, 基本是这些:@JsonIgnore忽略可能出问题 ...
- 关于Hibernate懒加载问题的最终解决方案
看到一篇Hibernate懒加载的文章,所以转载,原地址如下: http://tuoxie007.iteye.com/blog/334853 Hibernate的强大之处之一是懒加载功能,可以有效的降 ...
- hibernate懒加载(转载)
http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下 ...
- 关于s2sh框架关于hibernate懒加载问题的说明和解决方案
首先我们来看下面这个图,解释了一个web程序的一次请求流程! 懒加载异常的说明: 懒加载就是我们在查询一个对象时,它所有的属性是否要被查出来! 如果懒加载开启的话,session在service层就被 ...
- Hibernate懒加载的三种解决方案
Hibernate懒加载的两种解决方案: 1.Hibernate.initialize(代理对象) 2.在*.hbm.xml映射文件中添加lazy="false"属性 3.使用op ...
- Hibernate懒加载解析
Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来 ...
- hibernate懒加载
Hibernate懒加载解析 hibernatejoinsession数据库sqlobject Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适 ...
随机推荐
- OpenLayers添加和删除控件
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 跟我一起学extjs5(02--建立project项目)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jfok/article/details/35569057 跟我一起学extjs5(02--建立pro ...
- vue中router以及route的使用
路由基本概念 route,它是一条路由. { path: '/home', component: Home } routes,是一组路由. const routes = [ { path: '/hom ...
- UCloud-201809-001:Redis服务未授权访问漏洞安全预警
UCloud-201809-001:Redis服务未授权访问漏洞安全预警 尊敬的UCloud用户,您好! 发布时间 2018-09-11更新时间 2018-09-11漏洞等级 HighCVE编号 ...
- 链表经典题Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- Directx11教程(3) 一个最基本D3D应用程序(1)
原文:Directx11教程(3) 一个最基本D3D应用程序(1) 在前一篇教程程序代码的基础上,这次我们将增加2个类: InputClass,键盘处理的代码将放在这个类里面,Graphi ...
- LRM-00109: could not open parameter file '/u01/app/oracle/product/12.1.0/db_1/dbs/initepps.ora'
安装好oracle后,起动时报如下错误: [oracle@Oracle-A ~]$ export ORACLE_SID=ORCL [oracle@Oracle-A ~]$ sqlplus / as s ...
- Person Re-identification 系列论文笔记(三):Improving Person Re-identification by Attribute and Identity Learning
Improving Person Re-identification by Attribute and Identity Learning Lin Y, Zheng L, Zheng Z, et al ...
- SDUT_2502:火星计数法
火星人的计数规则里只有a,b,c,d四个字母,计数规则从小到大是 a,b,c,d,aa,ab,ac,ad,ba,……. 给出来由a,b,c,d四种字母组成的火星数字,算出该数字是第几个(从1开始). ...
- UVA_458:The Decoder
Language:C++ 4.8.3 PS:ASCII值减去七 #include<stdio.h> #include<string.h> int main(void) { c ...