Org.hibernate.LazyInitializationException после использования HibernateProxyTypeAdapter для Gson

У меня возникла проблема с Gson, потому что он не может перейти к объектам Json HibernateProxy, поэтому я следовал этому руководству: ссылка на сайт

Это решает проблему typeAdapter с Gson, но теперь я получаю следующее исключение:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

Я искал, как решить эту проблему, но решения, которые я нашел, в этом случае не работают.

Это мой код:

List<ContratoSolicitudFull> returnValue = 
                    new SomeBL().getData(id, null, null,currentUserId);

Type type = new TypeToken<List<ContratoSolicitudFull>>() {}.getType();
    Gson gson = new GsonBuilder()
            .registerTypeAdapter(DateTime.class, new DateTimeJsonConverter())
            .registerTypeAdapter(LocalDate.class, new LocalDateJsonConverter())
            .registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY)
            .create();
    String jsonValue = gson.toJson(returnValue, type); //Here is where it fail

Любая идея?

Посредством сериализации в json вы получаете доступ к извлеченным данным вне контекста сеанса.

Michal 15.06.2018 12:23

Есть ли у вас какая-либо связанная сущность, которая FETCH_TYPE ленива

Gaurav Srivastav 15.06.2018 12:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
437
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Посредством сериализации в json вы получаете доступ к извлеченным данным вне контекста сеанса.

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

@SuppressWarnings({"rawtypes", "unchecked"})
    @Override
    public void write(JsonWriter out, HibernateProxy value) throws IOException {
        //avoid serializing non initialized proxies
        if (value == null || !Hibernate.isInitialized(value)) {
            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);
    } 

|| !Hibernate.isInitialized(value) был добавлен, чтобы проверить, инициализирована ли коллекция, и, если нет, избегает доступа к ней.

Это тот же ответ, который я опубликовал в вопросе

DMC19 15.06.2018 12:38

вам нужно добавить || ! Hibernate.isInitialized (значение)

Michal 15.06.2018 12:40

Другие вопросы по теме