Серийный анализатор не найден для класса org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor
Когда я пытаюсь выполнить навигацию до конечной точки, я получаю следующую ошибку
Ошибка определения типа: [простой тип, класс org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; Вложенное исключение - com.fasterxml.jackson.databind.exc.InvalidDefinitionException: сериализатор не найден для класса org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor и никаких свойств, обнаруженных для создания BeanSerializer (во избежание исключения отключите SerializationFeature.FAIL_ON_EMPTY_BEANS)
Я проверил все свои модели, и все атрибуты имеют getters и seters. Так в чем проблема?
Я могу исправить это, добавив 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>>>
Ответы
Ответ 1
Вы можете игнорировать создание вывода 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
Я надеюсь, что ваша проблема будет решена. Благодарю.
Ответ 2
Хм, вы пытаетесь отправить сущности из одного экземпляра jvm в другой, который должен их сериализовать? если это так, я думаю, что ошибка связана с тем, что вы каким-то образом взяли сущности, а hibernate использует не сериализуемые классы, вам нужно преобразовать объекты в pojo (я имею в виду использование собственных типов или объектов, которые являются сериализуемыми).
Ответ 3
У меня была эта проблема из-за моих аннотаций Джексона. У меня был объект SampleChild
с этим полем:
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@RestResource(path = "childParent", rel = "parent")
private SampleParent sampleParent;
И объект SampleParent
с этим полем:
@JsonIgnore
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "sampleParent")
private List<SampleChild> child;
Вызов ресурса childParent
путем получения sampleChild/{id}/childParent
вызвал ошибку. Я @JsonIgnore
с этой проблемой, переключив @JsonIgnore
с @JsonManagedReference
, что на самом деле имело больше смысла для моих целей. Я до сих пор не уверен, почему исключение дочернего поля из родительского вывода JSON приведет к ошибке при сериализации пустого компонента.
Ответ 4
Я столкнулся с этой ошибкой, когда делал урок с весенним репозиторием. Оказалось, что ошибка была допущена на этапе построения класса обслуживания для моей сущности.
В вашем классе serviceImpl у вас, вероятно, есть что-то вроде:
@Override
public YourEntityClass findYourEntityClassById(Long id) {
return YourEntityClassRepositorie.getOne(id);
}
Измените это на:
@Override
public YourEntityClass findYourEntityClassById(Long id) {
return YourEntityClassRepositorie.findById(id).get();
}
Это потому, что getOne() возвращает ссылку.