Не найден сериализатор для класса org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor

Когда я пытаюсь перейти к конечной точке, я получаю следующую ошибку

Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

Я проверил все свои модели, и у всех атрибутов есть геттеры и сеттеры. Так в чем проблема ?

Я могу исправить это, добавив spring.jackson.serialization.fail-on-empty-beans=false, но я думаю, что это просто работа, чтобы скрыть исключение.

Редактировать

Product модель:

@Entity
public class Product {
    private int id;
    private String name;
    private String photo;
    private double price;
    private int quantity;
    private Double rating;
    private Provider provider;
    private String description;
    private List<Category> categories = new ArrayList<>();
    private List<Photo> photos = new ArrayList<>();
    
    // Getters & Setters
}

PagedResponse класс:

public class PagedResponse<T> {

    private List<T> content;
    private int page;
    private int size;
    private long totalElements;
    private int totalPages;
    private boolean last;
    
    // Getters & Setters
}

RestResponse Класс:

public class RestResponse<T> {
    private String status;
    private int code;
    private String message;
    private T result;

    // Getters & Setters
}

В моем контроллере я возвращаю ResponseEntity<RestResponse<PagedResponse<Product>>>

Я столкнулся с той же самой проблемой, добавил запись для пропуска, и я могу видеть ответ, ранее он не работал. Спасибо за этот вопрос и подсказку fail-on-empty-beans

Anand Rockzz 12.11.2018 03:08

проверьте ответ здесь stackoverflow.com/a/51129161/2160969

Wiz 14.05.2019 07:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
82
2
74 955
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Хм, вы собираетесь отправлять объекты из одного экземпляра jvm в другой, который должен их сериализовать? если это так, я думаю, что ошибка связана с тем, что вы каким-то образом извлекли сущности, а спящий режим использует свои несериализуемые классы, вам необходимо преобразовать сущности в pojo (я имею в виду использовать собственные типы или объекты, которые являются сериализуемыми).

Я не совсем понимаю, что вы говорите, но думаю, что делаю это, пожалуйста, проверьте мою правку.

Ayoub k 05.10.2018 14:17

Вы можете игнорировать, чтобы создать вывод свойства в формате JSON,

@JsonIgnore 

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

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 

Пример:

@Entity
public class Product implements Serializable{
   private int id;
   private String name;
   private String photo;
   private double price;
   private int quantity;
   private Double rating;
   private Provider provider;
   private String description;

   @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
   private List<Category> categories = new ArrayList<>();

   @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
   private List<Photo> photos = new ArrayList<>();

   // Getters & Setters
}

Если ошибка не исчезла, добавьте эту строку кода в файл application.properties.

spring.jackson.serialization.fail-on-empty-beans=false

Надеюсь, ваша проблема будет решена. Спасибо.

Решение, предоставленное с помощью «@JsonIgnoreProperties», у меня не сработало. Изменение с FetchType.LAZY на FetchType.EAGER устранило проблему.

ghjansen 14.05.2019 02:49

@Subarata Talukder - Если мы используем @JsonIgnore, то мы теряем и детали графа сущностей ..

Pra_A 06.08.2019 08:12

@ghjansen - Я тоже получаю ту же ошибку, но в моем случае я не могу продолжать делать FetchType.EAGER. Не могли бы вы помочь мне с этим?

Pra_A 06.08.2019 15:14

Интересно, зачем кому-то больше использовать интерфейс Serializable? Это требование гибернации?

duffymo 06.08.2019 20:14

@PAA извините за задержку. Не уверен, что все еще вовремя, но я предлагаю вам взглянуть на baeldung.com/hibernate-lazy-eager-loading, чтобы дважды проверить, правильно ли вы используете ленивую загрузку. Как объяснено в разделе «5. Различия», я предполагаю, что в моем случае исключение произошло из-за отсутствия вызова геттера, который запускает выборку, инициализируя все атрибуты данного объекта. Альтернатива этому, есть способ использовать прокси, также описанный в этом же посте. Я скоро уйду с нетерпением и вернусь к ленивому, так как нетерпеливость - плохая практика.

ghjansen 25.09.2019 14:16

Пожалуйста, добавьте эту строку в свой файл application.properties spring.jackson.serialization.fail-on-empty-beans = false, если у вас все еще есть эта проблема.

Subarata Talukder 26.09.2019 05:35

spring.jackson.serialization.fail-on-empty-beans = false, у меня сработало Спасибо :)

Noorus Khan 24.08.2020 11:08

Но это не ответ на вопрос

ACV 05.09.2020 12:46

Пожалуйста, дайте ответ на вопрос @ACV.

Subarata Talukder 06.09.2020 19:36

Добавление spring.jackson.serialization.fail-on-empty-beans = false в мой файл свойств решило это для меня

Edor Linus 08.06.2021 05:23
Ответ принят как подходящий

Я столкнулся с этой ошибкой, когда делал учебник с репозиторием Spring. Оказалось, что ошибка была сделана на этапе построения класса обслуживания для моей сущности.

В вашем классе serviceImpl у вас, вероятно, есть что-то вроде:

    @Override
    public YourEntityClass findYourEntityClassById(Long id) {
      return YourEntityClassRepositorie.getOne(id);
    }

Измените это на:

    @Override
    public YourEntityClass findYourEntityClassById(Long id) {
      return YourEntityClassRepositorie.findById(id).get();
    }

По сути, getOne - это операция отложенной загрузки. Таким образом, вы получаете только ссылку (прокси) на объект. Это означает, что доступ к БД фактически не осуществляется. Только когда вы вызываете его свойства, он будет запрашивать БД. findByID выполняет вызов «нетерпеливо» / немедленно, когда вы его вызываете, таким образом, у вас есть фактическая сущность, полностью заполненная.

Взгляните на это: Ссылка на разницу между getOne и findByID

Спасибо, что поделились.

seenimurugan 09.03.2020 20:47

@Szelek, спасибо за это, я получал ту же ошибку, потому что я использовал метод getOne (), теперь изменил его на findById (id) .get ().

Rajan Chauhan 15.05.2020 14:28

вау, @Szelek, ты бог. Я не понимаю, почему это небольшое изменение спасло мне жизнь.

Lay Leangsros 24.05.2020 14:41

Исправлено для меня, спасибо за информацию. Смотрели учебник, в котором они использовали getOne (), кто-нибудь знает, почему этот метод не работает должным образом?

Martin Boros 29.05.2020 19:46

@LayLeangsros задавался вопросом о том же, что и я. Нашел эту замечательную статью, в которой описаны различия между getOne и findById. По сути, getOne - это операция отложенной загрузки. Таким образом, вы получаете только ссылку (прокси) на объект. Это означает, что доступ к БД фактически не осуществляется. Только когда вы вызываете его свойства, он будет запрашивать БД. findByID выполняет вызов сразу, когда вы его вызываете, поэтому фактическая сущность полностью заполнена. javacodemonk.com/…

Gorjan Mishevski 27.09.2020 15:07

Спасибо. Ваше предложение сработало для меня.

user1419261 12.12.2020 21:07

Я тоже столкнулся с этой проблемой. Ответ @ Szelek мне помог. Но я сделал это по-другому. Изменен метод getOne () на:

repository.findById(id).orElse(null)

Убедитесь, что вы позаботились о NullPointerException, который сгенерирует, когда он не будет найден.

Это вызовет исключение NullPointer. Необязательно не может вернуть null

jfzr 13.02.2020 04:50

Спасибо. Ты спас мне день.

seenimurugan 09.03.2020 20:46

@jfzr О Необязательно: объект-контейнер, который может содержать или не содержать ненулевое значение.

SNabi 05.04.2020 19:56

Изменение FetchType с ленивого на нетерпеливое помогло мне.

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) у меня работает очень хорошо. Не пропускает ни одного эталонного объекта и устраните проблему.

В моем случае:

@Entity
@Table(name = "applications")
public class Application implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotBlank
    @Size(max = 36, min = 36)
    private String guid;

    @NotBlank
    @Size(max = 60)
    private String name;

    @Column(name = "refresh_delay")
    private int refreshDelay;

    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "id_production", referencedColumnName = "id")
    @JsonIgnoreProperties(value = {"applications", "hibernateLazyInitializer"})
    private Production production;

Я тоже столкнулся с той же проблемой. Я использовал repo.getOne (id); Я изменил его на repo.findById (id). Он вернулся как необязательный, но теперь ошибка исчезла

Переход от

MyEntityClassRepositorie.getOne(id)

к

MyEntityClassRepositorie.findById(id).get()

у меня отлично работает.

Для меня я получил эту ошибку для объекта DTO. Проблема заключалась в том, что я не предоставил геттеры для свойств DTO. Следовательно, Джексон не смог получить эти значения и предположил, что компонент пуст. Решение:

Add Getters to your DTO

Это решило мою проблему.

 @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

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