Когда я пытаюсь перейти к конечной точке, я получаю следующую ошибку
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>>>
проверьте ответ здесь stackoverflow.com/a/51129161/2160969




Хм, вы собираетесь отправлять объекты из одного экземпляра jvm в другой, который должен их сериализовать? если это так, я думаю, что ошибка связана с тем, что вы каким-то образом извлекли сущности, а спящий режим использует свои несериализуемые классы, вам необходимо преобразовать сущности в pojo (я имею в виду использовать собственные типы или объекты, которые являются сериализуемыми).
Я не совсем понимаю, что вы говорите, но думаю, что делаю это, пожалуйста, проверьте мою правку.
Вы можете игнорировать, чтобы создать вывод свойства в формате 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 устранило проблему.
@Subarata Talukder - Если мы используем @JsonIgnore, то мы теряем и детали графа сущностей ..
@ghjansen - Я тоже получаю ту же ошибку, но в моем случае я не могу продолжать делать FetchType.EAGER. Не могли бы вы помочь мне с этим?
Интересно, зачем кому-то больше использовать интерфейс Serializable? Это требование гибернации?
@PAA извините за задержку. Не уверен, что все еще вовремя, но я предлагаю вам взглянуть на baeldung.com/hibernate-lazy-eager-loading, чтобы дважды проверить, правильно ли вы используете ленивую загрузку. Как объяснено в разделе «5. Различия», я предполагаю, что в моем случае исключение произошло из-за отсутствия вызова геттера, который запускает выборку, инициализируя все атрибуты данного объекта. Альтернатива этому, есть способ использовать прокси, также описанный в этом же посте. Я скоро уйду с нетерпением и вернусь к ленивому, так как нетерпеливость - плохая практика.
Пожалуйста, добавьте эту строку в свой файл application.properties spring.jackson.serialization.fail-on-empty-beans = false, если у вас все еще есть эта проблема.
spring.jackson.serialization.fail-on-empty-beans = false, у меня сработало Спасибо :)
Но это не ответ на вопрос
Пожалуйста, дайте ответ на вопрос @ACV.
Добавление spring.jackson.serialization.fail-on-empty-beans = false в мой файл свойств решило это для меня
Я столкнулся с этой ошибкой, когда делал учебник с репозиторием 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
Спасибо, что поделились.
@Szelek, спасибо за это, я получал ту же ошибку, потому что я использовал метод getOne (), теперь изменил его на findById (id) .get ().
вау, @Szelek, ты бог. Я не понимаю, почему это небольшое изменение спасло мне жизнь.
Исправлено для меня, спасибо за информацию. Смотрели учебник, в котором они использовали getOne (), кто-нибудь знает, почему этот метод не работает должным образом?
@LayLeangsros задавался вопросом о том же, что и я. Нашел эту замечательную статью, в которой описаны различия между getOne и findById. По сути, getOne - это операция отложенной загрузки. Таким образом, вы получаете только ссылку (прокси) на объект. Это означает, что доступ к БД фактически не осуществляется. Только когда вы вызываете его свойства, он будет запрашивать БД. findByID выполняет вызов сразу, когда вы его вызываете, поэтому фактическая сущность полностью заполнена. javacodemonk.com/…
Спасибо. Ваше предложение сработало для меня.
Я тоже столкнулся с этой проблемой. Ответ @ Szelek мне помог. Но я сделал это по-другому. Изменен метод getOne () на:
repository.findById(id).orElse(null)
Убедитесь, что вы позаботились о NullPointerException, который сгенерирует, когда он не будет найден.
Это вызовет исключение NullPointer. Необязательно не может вернуть null
Спасибо. Ты спас мне день.
@jfzr О Необязательно: объект-контейнер, который может содержать или не содержать ненулевое значение.
Изменение 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"})
Я столкнулся с той же самой проблемой, добавил запись для пропуска, и я могу видеть ответ, ранее он не работал. Спасибо за этот вопрос и подсказку
fail-on-empty-beans