在使用hibernate的过程中, 对于某些关联的属性对象 有进行懒加载的操作, 这时如果存在懒加载的对象,进行json序列化的时候,会报错。
可以使用一个过滤器,进行 过滤不需要被序列化的属性,主要是应用于Hibernate的代理和管理。
代码如下
package com.lazyant.util;
import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.proxy.HibernateProxy;
import org.hibernate.proxy.LazyInitializer;
import com.alibaba.fastjson.serializer.PropertyFilter;
public class HibernatePropertyFilter implements PropertyFilter {
/**
* 过滤不需要被序列化的属性,主要是应用于Hibernate的代理和管理。
* @param object 属性所在的对象
* @param name 属性名
* @param value 属性值
* @return 返回false属性将被忽略,ture属性将被保留
*/
@Override
public boolean apply(Object object, String name, Object value) {
if (value instanceof HibernateProxy) {//hibernate代理对象
LazyInitializer initializer = ((HibernateProxy) value).getHibernateLazyInitializer();
if (initializer.isUninitialized()) {
return false;
}
} else if (value instanceof PersistentCollection) {//实体关联集合一对多等
PersistentCollection collection = (PersistentCollection) value;
if (!collection.wasInitialized()) {
return false;
}
Object val = collection.getValue();
if (val == null) {
return false;
}
}
return true;
}
}
在需要json序列化前,先实例化该对象
例如
HibernatePropertyFilter filter = new HibernatePropertyFilter();
List<Order> orderList = orderService.findList(status, user.getId(), null);
String jsonString = JSON.toJSONString(orderList, filter, SerializerFeature.DisableCircularReferenceDetect);
备注: 使用 SerializerFeature.DisableCircularReferenceDetect 的目的在于 解决 FastJSON中 "$ref 循环引用"的问题