在春天,我的班级之间有一对一对多的关系。当我试图得到我所有的数据--一个类似无限递归的错误--这是整个错误信息。
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25) ~[jackson-databind-2.9.6.jar:2.9.6]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.9.6.jar:2.9.6]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719) ~[jackson-databind-2.9.6.jar:2.9.6]我有两个类,它们通过OneToMany关系相互连接
用户类
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToMany(mappedBy = "User")
private List<Conversation> Conversation;会话类
public class Conversation {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "User_id")
private User User;结果屏幕热
我不知道为什么会发生这种情况,但可能是因为与班级失败的关系。
仓库类
@Query(nativeQuery = true, value = "SELECT * FROM `conversation` WHERE 1")
public List<Conversation> findAllConv();控制器类
@Autowired
private ConversationRepository conv;
@GetMapping("/GetAllConversation")
public List<Conversation> getAllConv()
{
return conv.findAllConv();
}全跟踪
2021-05-14 12:58:57.306 ERROR 1540 --- [nio-8020-exec-1] w.s.e.ErrorMvcAutoConfiguration$SpelView : Cannot render error page for request [/survey/GetAllConversation/] and exception [Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: org.club.entities.User_$$_jvstf65_b["conversation"]->org.hibernate.collection.internal.PersistentBag[0]->org.club.entities.Conversation["user"]-发布于 2021-05-13 22:04:30
在一般情况下使用关系时,可以调整"fetch“和”级联“类型。抓取意味着,如果所有与要加载的条目相关的条目都被加载,而级联则与当前条目上的操作有关,则传递到相关对象。
Edit1:我建议您尝试将fetch类型设置为惰性,至少对于Conversation类是这样的:
@ManyToOne(fetch = FetchType.LAZY)除此之外,我建议使用继承自CrudRepository的存储库,以便您可以使用派生查询。
Edit2:看到堆栈跟踪之后,问题就变得清楚了。Jackson试图将Conversation对象绑定到JSON,但由于User类中的会话引用,它遇到了一个没完没了的循环。
解决这个问题有两种方法。如果仍然希望插入由User引用的Conversation对象,则可以添加@JsonIgnore注释。
@JsonIgnore
@OneToMany(mappedBy = "User")
private List<Conversation> Conversation; 如果您根本不关心用户,那么还可以将其添加到会话对象中的用户引用中:
@JsonIgnore
@JoinColumn(name = "User_id")
private User User;如果稍后遇到问题,还可以考虑将存储库返回的Conversation对象映射到特定的数据传输对象,这些对象是专门为JSON映射创建的。
发布于 2021-05-14 15:37:40
通过堆栈跟踪和数据模型的问题在于,用户和转换类之间存在着双向关系。
用户有一个会话项列表,然后链接回用户。序列化时,这将创建一个无限循环。
序列化用户->,序列化他的会话,->序列化coversation.user,->,序列化他的会话等等。
避免这种情况的一种方法是用@JsonIgnore注释“转换”中的“用户”字段,这样在序列化用户时,您将得到他的会话,但是由于“引用”将被Jackson忽略,所以您将不会从堆栈跟踪中得到错误。
异常消息在这里非常清楚:无限递归(StackOverflowError) (通过引用链:)
https://stackoverflow.com/questions/67526700
复制相似问题