hibernate 在使用 GSON 渲染时不取消代理的原因是 GSON 使用反射来序列化字段,而不是使用 Hibernate 对象的 getter。要解决此问题,您需要注册一个新的 TypeHierarchyAdapter,它将在 GSON 序列化时取消代理该对象。
这是我的方法:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxySerializer());
String jsonLove = gson.toJson(objToSerialize);
这是 HibernateProxySerializer:
public class HibernateProxySerializer implements JsonSerializer<HibernateProxy> {
@Override
public JsonElement serialize(HibernateProxy proxyObj, Type arg1, JsonSerializationContext arg2) {
try {
GsonBuilder gsonBuilder = new GsonBuilder();
//below ensures deep deproxied serialization
gsonBuilder.registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxySerializer());
Object deProxied = proxyObj.getHibernateLazyInitializer().getImplementation();
return gsonBuilder.create().toJsonTree(deProxied);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}