解決辦法參考了一下: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);
}
