在一个对象上获取HibernateProxy

时间:2018-11-14 10:51:42

标签: java mysql hibernate spring-boot proxy

我使用的是Spring Boot API。这是我第一次遇到这个问题。

我正在通过带有存储库的findById函数加载不同的公司对象。所有公司对象均已正确加载,期望一个。这将加载一个JavassistLazyInitalizer类型的处理程序属性。其余属性全部在默认值上。在目标节点中的处理程序对象中,正确加载了我想要的对象。

所以我发现这是一种休眠延迟加载,因为当我想使用getter访问属性时,它可以正常工作。

我的问题是,我想在最后使用gson序列化对象,并且在序列化过程中遇到此错误:

尝试序列化java.lang.Class:org.hibernate.proxy.HibernateProxy。忘记注册类型适配器了?

我了解为什么会发生此错误。但是我不明白为什么只有一个不同的公司对象被延迟加载(或者是一个hibernateProxy)。 那么避免hibernateProxy分别序列化对象的最聪明方法是什么?

感谢您的回答:)

2 个答案:

答案 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();

发现此问题的答案Could not serialize object cause of HibernateProxy