没有为 org.hibernate.proxy.pojo.byteBuddy. ByteBuddyInterceptor 类找到序列化程序

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

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)

我检查了所有的模型,所有的属性都有 getter 和 setter?

我可以通过添加 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>>>

131407 次浏览

您正在尝试将实体从 jvm 的一个实例发送到需要序列化它们的另一个实例吗?如果是这种情况,我认为错误是因为您以某种方式获取了实体,并且 hibernate 正在使用其不可序列化的类,那么您需要将实体转换为 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

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

我在使用 Spring 仓库进行教程时遇到了这个错误。结果是,在为我的实体构建服务类的阶段出现了错误。

在 serviceImpl 类中,您可能有以下内容:

    @Override
public YourEntityClass findYourEntityClassById(Long id) {
return YourEntityClassRepositorie.getOne(id);
}

将其更改为:

    @Override
public YourEntityClass findYourEntityClassById(Long id) {
return YourEntityClassRepositorie.findById(id).get();
}

Basically getOne is a lazy load operation. Thus you get only a reference (a proxy) to the entity. That means no DB access is actually made. Only when you call it's properties then it will query the DB. findByID does the call 'eagerly'/immediately when you call it, thus you have the actual entity fully populated.

看看这个: 链接到 getOne 和 findByID 之间的区别

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

repository.findById(id).orElse(null)

确保您正在照顾的 NullPointerException,这将生成时,它不被发现。

将 FetchType 从惰性更改为渴望更改对我来说非常有效。

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})为我工作得很好。 它不会遗漏任何引用对象和解决问题。

In my case:

@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()

work fine for me.

对于我来说,我得到了 DTO 对象的这个错误。问题是我没有为 DTO 属性提供 getter。因此,Jackson 无法获取这些值,并假定 bean 为空。返回文章页面

将 Getters 添加到 DTO

这解决了我的问题。

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

这个问题的答案来自这本书: “利用弹簧启动学习微服务” 与抑制 Spring 建议的空 bean 上的错误不同,还有更可取的方法来处理这个问题。

我们将嵌套的 User 实体配置为以 LAZY 模式获取,因此 他们没有被从数据库中查询,我们也说过 Hibernate 在运行时为我们的类创建代理 reason behind the ByteBuddyInterceptor class. You can try switching 提取模式为 EAGER,您将不再得到这个错误。但是 这不是解决这个问题的正确方法 触发许多我们不需要的数据查询。让我们保持懒惰 我们的第一个选择是 定制我们的 JSON 序列化,以便它能够处理 Hibernate 对象。 Luckily, FasterXML,the provider of Jackson libraries, has a specific 我们可以在 ObjectMapper 对象中使用的 Hibernate 模块: Jackson-datatype-hibernate:

<dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-hibernate5</artifactId>
</dependency>

我们为 Jackson 的新 Hibernate 模块创建一个 bean Boot 的 Jackson2ObjectMapperBuilder 将通过自动配置使用它, 所有 ObjectMapper 实例都将使用 Spring Boot 默认值 加上我们自己的定制。

import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JsonConfiguration {
    @Bean
    public Module hibernateModule() {
        return new Hibernate5Module();
    }
}

在我的例子中,@EntityGraph也面临同样的异常。实际上,我试图通过 EntityGraph 获取 OneTomany (库存清单) ,它正在工作,但是当我试图获取另一个与 ManyToOne (类别)的关系时,它出现了错误。我不知道它为什么变懒了。正如我们所知,@ManyToOne默认是热切的。

class Product {
 

@ManyToOne
@JoinColumn(name = "categoryId")
private Category category;


@OneToMany(mappedBy = "product", cascade = CascadeType.ALL)
private List<Inventory> inventoryList;
}

Repository method:

@EntityGraph(attributePaths = { "inventoryList" })
List<Product> findAll();

我得到了同样的期望,因为我没有添加类别在 EntityGraph 获取。

@EntityGraph(attributePaths = { "inventoryList", "category" })
List<Product> findAll();

当我在本地主机上工作时,我只需要一个服务器

<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>9.0.65</version>
</dependency>