java - JPA 在创建后返回嵌套对象 - 500 内部服务器错误

标签 java spring hibernate jpa

我有我的主要对象:

@Data
@Entity
@EqualsAndHashCode(callSuper = false)
@Table(name = MAIN_OBJ)
public class MainObj {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "MAIN_OBJ_ID", unique = true, nullable = false)
    private Integer manObjId;

    @ManyToOne
    @JoinColumn(name = "SUB_OBJ_ID", referencedColumnName = "SUB_OBJ_ID", nullable = false)
    @NotNull
    private SubObj subObj;

}

它的子对象:

@Data
@Entity
@EqualsAndHashCode(callSuper = false)
@Table(name = SUB_OBJ)
public class SubObj {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "SUB_OBJ_ID", unique = true, nullable = false)
    private Integer subObjId;

    @Column(name = "NAME", nullable = false)
    @NotNull
    private String name;

}

当我进行创作时:

@Override
@Transactional
public MainObj create(MainObj mainObj) {
    MainObj createdMainObj = mainObjRepository.save(mainObj);
    return createdMainObj;
}

它保存正确,但是当我将其返回给用户(通过 Controller 返回)时,我得到了 500 的返回值。调试后可以看到subObj中的所有字段都为空。

但它实际上创建了 mainObj 并将其放入数据库,只是未能序列化它并返回。

如果我追踪得足够多,我会看到:

No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer

不太确定我需要添加什么,以便我可以将完全创建的对象及其对 subObj 的外键引用返回给用户。

我像很多帖子所说的那样尝试了 Hibernate.initialize() 但没有运气。

如果不清楚,它会返回以下其中之一:

enter image description here

完整的堆栈跟踪(删除了一些细节):

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.path.to.MainObj["subObj"]-com.path.to.SubObj_$$_jvsta14_f["handler"])

最佳答案

最佳实践是不要直接在 Controller 中返回实体(因为这可能会导致堆栈溢出异常)。该实体应转换为 DTO(数据传输对象)并返回 DTO。

如果您仍然想使用实体,则应该对所有引用(包括引用对象内的引用对象)使用 eager 而不是 lazy ;

关于java - JPA 在创建后返回嵌套对象 - 500 内部服务器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55850126/

相关文章:

java - 反序列化集合时不安全的泛型转换

java - 如何使用 apache poi 4.1.0 设置单元格的背景颜色

java - spring 如何将参数注入(inject)到 Controller 方法中

java - 将注释工作的结果传递给注释方法

hibernate - Spring 中对实体管理器的静态访问和不寻常的架构

java - 异步文件下载器android

java - 通知客户端中的线程,该线程是在服务器中的 wait() 上发送的

Spring MVC-通过token-confirm账户方式激活账户返回404错误

java - Hibernate OneToMany 双向不识别外键

java - Spring Data JPA JpaRepository.save(entity) 不返回数据库默认值