GSON でのレンダリング中に hibernate が de-proxy しない理由は、GSON が Hibernate オブジェクトのゲッターを使用するのではなく、リフレクションを使用してフィールドをシリアル化するためです。回避するには、GSON がシリアル化するときにオブジェクトのプロキシを解除する新しい TypeHierarchyAdapter を登録する必要があります。
これが私のアプローチです:
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);
}
}
}