我有我的主要对象:
@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;
}
它可以正常保存但是当我将它返回给用户时(通过控制器返回)我得到500回。调试后,我可以看到subObj中的所有字段都为null。
但它确实创建了mainObj并将其放入db中,它只是无法序列化并返回。
如果我追踪它,我看到:
没有找到类org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer的序列化程序
不确定我需要添加什么,所以我可以将完全创建的对象返回给用户的subObj的外键引用。
我试过Hibernate.initialize()就像很多帖子说但没有运气。
如果不清楚它会给我一个回复:
完整堆栈跟踪(删除了一些细节):
org.springframework.http.converter.HttpMessageNotWritableException:无法编写JSON:没有为类org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer找到序列化程序,也没有发现创建BeanSerializer的属性(为了避免异常,请禁用SerializationFeature.FAIL_ON_EMPTY_BEANS);嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:没有为类org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer找到序列化器,也没有发现创建BeanSerializer的属性(为了避免异常,禁用SerializationFeature.FAIL_ON_EMPTY_BEANS)(通过引用链) :com.path.to.MainObj [“subObj”] - com.path.to.SubObj _ $$ _ jvsta14_f [“handler”])
你能试试吗?将此批注添加到SubObj类
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="SUB_OBJ_ID")
最佳实践是不直接在控制器中返回实体(因为它可能导致堆栈溢出异常)。实体应转换为DTO(数据传输对象)并返回DTO。
如果你仍然想使用实体,你应该对所有引用使用eager而不是lazy(包括引用对象内的引用对象);