Серийный анализатор не найден для класса 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() возвращает ссылку.