對象中又包含有對象,當要轉換成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