Java 未找到类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_bean) 我检查了所有模型,所有属性都有getter和setter。那有什么问题 我可以通过添加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的属性(为
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"})