首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25 SpringBoot

com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25 SpringBoot
EN

Stack Overflow用户
提问于 2021-05-13 21:56:06
回答 2查看 2.5K关注 0票数 1

在春天,我的班级之间有一对一对多的关系。当我试图得到我所有的数据--一个类似无限递归的错误--这是整个错误信息。

代码语言:javascript
复制
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关系相互连接

用户类

代码语言:javascript
复制
public class User  {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @OneToMany(mappedBy = "User")
    private List<Conversation> Conversation;

会话类

代码语言:javascript
复制
public class Conversation {
     @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
     @ManyToOne
     @JoinColumn(name = "User_id")
     private User User;

结果屏幕热

结果筛选

我不知道为什么会发生这种情况,但可能是因为与班级失败的关系。

仓库类

代码语言:javascript
复制
@Query(nativeQuery = true, value = "SELECT * FROM `conversation` WHERE 1")
public List<Conversation> findAllConv();

控制器类

代码语言:javascript
复制
 @Autowired
        private ConversationRepository conv;
        
        @GetMapping("/GetAllConversation")
        public List<Conversation> getAllConv()
        {
            return conv.findAllConv();
        }

全跟踪

代码语言:javascript
复制
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"]-
EN

回答 2

Stack Overflow用户

发布于 2021-05-13 22:04:30

在一般情况下使用关系时,可以调整"fetch“和”级联“类型。抓取意味着,如果所有与要加载的条目相关的条目都被加载,而级联则与当前条目上的操作有关,则传递到相关对象。

Edit1:我建议您尝试将fetch类型设置为惰性,至少对于Conversation类是这样的:

代码语言:javascript
复制
@ManyToOne(fetch = FetchType.LAZY)

除此之外,我建议使用继承自CrudRepository的存储库,以便您可以使用派生查询。

Edit2:看到堆栈跟踪之后,问题就变得清楚了。Jackson试图将Conversation对象绑定到JSON,但由于User类中的会话引用,它遇到了一个没完没了的循环。

解决这个问题有两种方法。如果仍然希望插入由User引用的Conversation对象,则可以添加@JsonIgnore注释。

代码语言:javascript
复制
@JsonIgnore
@OneToMany(mappedBy = "User")
private List<Conversation> Conversation; 

如果您根本不关心用户,那么还可以将其添加到会话对象中的用户引用中:

代码语言:javascript
复制
@JsonIgnore
@JoinColumn(name = "User_id")
private User User;

如果稍后遇到问题,还可以考虑将存储库返回的Conversation对象映射到特定的数据传输对象,这些对象是专门为JSON映射创建的。

票数 2
EN

Stack Overflow用户

发布于 2021-05-14 15:37:40

通过堆栈跟踪和数据模型的问题在于,用户和转换类之间存在着双向关系。

用户有一个会话项列表,然后链接回用户。序列化时,这将创建一个无限循环

序列化用户->,序列化他的会话,->序列化coversation.user,->,序列化他的会话等等。

避免这种情况的一种方法是用@JsonIgnore注释“转换”中的“用户”字段,这样在序列化用户时,您将得到他的会话,但是由于“引用”将被Jackson忽略,所以您将不会从堆栈跟踪中得到错误。

异常消息在这里非常清楚:无限递归(StackOverflowError) (通过引用链:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67526700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档