Получить HibernateProxy на одном объекте - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю с API весенней загрузки.Впервые у меня возникает эта проблема.

Я загружаю различные объекты компании через функцию findById с хранилищем.Все объекты компании загружены правильно, ожидайте одного.Этот загружает свойство обработчика типа JavassistLazyInitalizer вместе с ним.Все остальные свойства имеют значение по умолчанию.В объекте-обработчике в целевом узле правильно загружен объект, как я хочу.

Итак, я обнаружил, что это тип медленной отложенной загрузки, потому что, когда я хочу получить доступ к свойству с помощью геттера, он работает правильно.

Моя проблема то, что я хочу сериализовать объект с gson в конце, и я получаю эту ошибку во время процесса serilazition:

Попытка сериализации java.lang.Class: org.hibernate.proxy.HibernateProxy.Забыли зарегистрировать адаптер типа?

Я понимаю, почему возникает эта ошибка.Но я не понимаю, почему загружается только один из различных объектов компании (или это hibernateProxy). Так, каков самый умный способ избежать hibernateProxy, соответственно, для сериализации объекта?

Спасибо за ваши ответы:)

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Этот адаптер - мое решение.

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

Ответ на этот вопрос найден Не удалось сериализовать объектную причину HibernateProxy

0 голосов
/ 14 ноября 2018

Причиной может быть то, что вы делаете некоторые операции с правильно загруженными объектами. Например, если вы вызываете какой-либо метод (необязательный метод получения) загруженного персистентного класса, Hibernate инициализирует все прокси.

И вы ничего не делаете с объектом, который загружен неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...