Java 未找到类org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor的序列化程序

Java 未找到类org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor的序列化程序,java,spring,hibernate,spring-mvc,spring-boot,Java,Spring,Hibernate,Spring Mvc,Spring Boot,当我尝试导航到一个端点时,我得到以下错误 类型定义错误:[简单类型,类org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor];嵌套异常为com.fasterxml.jackson.databind.exc.InvalidDefinitionException:未找到类org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor的序列化程序,也未找到创建BeanSerializer的属性(为

当我尝试导航到一个端点时,我得到以下错误

类型定义错误:[简单类型,类org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor];嵌套异常为com.fasterxml.jackson.databind.exc.InvalidDefinitionException:未找到类org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor的序列化程序,也未找到创建BeanSerializer的属性(为避免异常,请禁用SerializationFeature.FAIL_ON_EMPTY_bean)

我检查了所有模型,所有属性都有getter和setter。那有什么问题

我可以通过添加
spring.jackson.serialization.fail on empty beans=false
来解决这个问题,但我认为这只是一个隐藏异常的方法

编辑

产品
型号:

@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
}
response
Class:

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

    // Getters & Setters
}
公共类重新响应{
私有字符串状态;
私有整数码;
私有字符串消息;
私人T结果;
//接球手和接球手
}

在我的控制器中,我返回
ResponseEntity

嗯,您是否尝试将实体从一个jvm实例发送到另一个需要序列化它们的实例?如果是这种情况,我认为错误是因为您以某种方式获取了实体,而hibernate正在使用其不可序列化的类,那么您需要将实体转换为pojo(我的意思是使用可序列化的本机类型或对象)。

您可以通过

@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
}

我希望你的问题会得到解决。谢谢。

我在使用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时,findByID会立即“急切地”调用它,因此您已经完全填充了实际的实体


看看这个:

我也面临着这个问题@斯泽莱克的回答帮助了我。但我用另一种方式做到了。将getOne()方法更改为:

repository.findById(id).orElse(null)

确保您正在处理未找到时将生成的
NullPointerException

将FetchType从lazy更改为Earge对我起到了作用。

@JsonIgnoreProperties({“HibernateLazInitializer”,“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)


对我来说很好。

对我来说,我在DTO对象中遇到了这个错误。问题是我没有为DTO属性提供getter。因此,Jackson无法获取这些值,并假设bean为空解决方案

向DTO添加getter

这解决了我的问题

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

我不太明白你在说什么,但我想我正在这么做,请检查我的编辑。我遇到了同样的问题,添加了道具条目,我能够看到回复,之前它失败了。感谢您的提问和提示
空bean失败
在这里检查答案“@JsonIgnoreProperties”提供的解决方案对我不起作用。从FetchType.LAZY更改为FetchType.EAGER解决了这个问题。@Subata Talukder-如果我们使用
@JsonIgnore
,那么我们也会丢失实体图的详细信息。@ghjansen-我也会遇到同样的错误,但在我的情况下,我不能继续执行
FetchType.EAGER
。你能帮我一下吗?我想知道为什么有人会再使用可序列化接口了。这是休眠要求吗?@PAA很抱歉耽搁了。不确定是否仍然及时,但我建议您仔细检查一下是否使用了正确的延迟加载方式。正如在“5.Differences”中所解释的,我猜在我的例子中,异常是由于缺少getter调用而发生的,getter调用触发fetch,初始化给定对象的所有属性。除此之外,还有一种使用代理的方法,在同一篇文章中也进行了解释。我将很快离开“渴望”,回到“懒惰”,因为“渴望”是一种不好的做法。这将引发NullPointer异常。可选无法返回空值。谢谢。你救了我一天。@jfzr关于可选:一个容器对象,它可能包含也可能不包含非空值。谢谢你的分享。@Szelek谢谢你,我得到了同样的错误,因为我使用getOne()方法,现在将它改为findById(id)。get()。哇,@Szelek,你是上帝。我不明白为什么这个小小的改变救了我的命。为我修正了,谢谢你的信息。看了一个他们使用getOne()的教程,有人知道为什么这个方法不能正常工作吗?@laylangsros对我自己也有同样的疑问。发现了这篇描述getOne和findById之间差异的伟大文章。基本上getOne是一个延迟加载操作。因此,您只能获得实体的引用(代理)。这意味着实际上没有数据库访问。只有当您调用它的属性时,它才会查询数据库。findByID在调用eagry时正确地执行了调用,因此实际实体已完全填充。
MyEntityClassRepositorie.getOne(id)
MyEntityClassRepositorie.findById(id).get()
 @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})