解决因为hibernate的懒加载引起的json 序列化失败的问题

在使用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 循环引用"的问题

具体可看 解决FastJson中“$ref 循环引用”的问题 



发布了21 篇原创文章 · 获赞 2 · 访问量 7508

猜你喜欢

转载自blog.csdn.net/qq_35551089/article/details/54861160