我使用的是Spring Boot API。这是我第一次遇到这个问题。
我正在通过带有存储库的findById函数加载不同的公司对象。所有公司对象均已正确加载,期望一个。这将加载一个JavassistLazyInitalizer类型的处理程序属性。其余属性全部在默认值上。在目标节点中的处理程序对象中,正确加载了我想要的对象。
所以我发现这是一种休眠延迟加载,因为当我想使用getter访问属性时,它可以正常工作。
我的问题是,我想在最后使用gson序列化对象,并且在序列化过程中遇到此错误:
尝试序列化java.lang.Class:org.hibernate.proxy.HibernateProxy。忘记注册类型适配器了?
我了解为什么会发生此错误。但是我不明白为什么只有一个不同的公司对象被延迟加载(或者是一个hibernateProxy)。 那么避免hibernateProxy分别序列化对象的最聪明方法是什么?
感谢您的回答:)
答案 0 :(得分:0)
原因可能是您对正确加载的对象进行了某些操作。例如,如果您调用已加载的持久化类的任何方法(不必要的getter),则Hibernate会初始化所有代理。
对于不正确加载的对象,您什么也不做。
答案 1 :(得分:0)
此适配器是我的解决方案。
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);
}
}
您必须将此添加到gsonBuilder。
new GsonBuilder().registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY).create();