对象中又包含有对象,当要转换成json格式时发生异常!org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?


解决办法参考了一下:http://www.17jquery.com/javascript/54343/

java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class:
org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?

因为gson在转换时是使用的反射机制,当获取的实体对象还在hibernate代理的时候,例如刚通过Id获取到,这时候获取到的便是代理对象HibernateProxy。这和直接调用实体对象的get方法不同,获取对象的属性就不能起作用。

  解决的方法便是将代理对象实例化,见下面的代码

/**
 * 
 * 代理对象实例化 工具类 
 * 代理对象:我这么理解,就是一个java类中引用到了其他的类,导致无法解析该被代理的类
 * 所以用这个类来帮助进行解析 
 * @author 
 *
 */
public class HibernateProxyTypeAdapter extends TypeAdapter<HibernateProxy> {

    public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() {
    	
    @Override
    @SuppressWarnings("unchecked")
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        return (HibernateProxy.class.isAssignableFrom(type.getRawType()) ? (TypeAdapter<T>) new HibernateProxyTypeAdapter(gson) : null);
    }
    };
    private final Gson context;

    private HibernateProxyTypeAdapter(Gson context) {
        this.context = context;
    }

    @Override
    public HibernateProxy read(JsonReader in) throws IOException {
        throw new UnsupportedOperationException("Not supported");
    }

    @SuppressWarnings({"rawtypes", "unchecked"})
    @Override
    public void write(JsonWriter out, HibernateProxy value) throws IOException {
        if (value == null) {
            out.nullValue();
            return;
        }
        // Retrieve the original (not proxy) class
        Class<?> baseType = Hibernate.getClass(value);
        // Get the TypeAdapter of the original class, to delegate the serialization
        TypeAdapter delegate = context.getAdapter(TypeToken.get(baseType));
        // Get a filled instance of the original class
        Object unproxiedValue = ((HibernateProxy) value).getHibernateLazyInitializer()
                .getImplementation();
        // Serialize the value
        delegate.write(out, unproxiedValue);
    }
}

  用的时候:

/**
	 * 要转换成json的对象中不全是值属性,还包含了引用对象     
	 * @param obj
	 */
	public void returnJsonByObjectForHaveObject(Object obj){
		
		Gson gson = new GsonBuilder()
		.registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY)
		.create();
		jsonString2 = gson.toJson(obj);
		
		this.returnJsonToPage(jsonString2);
	}

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM