当前位置: 首页 > 知识库问答 >
问题:

spring mvc控制器中的无限json序列化

蒋曾笑
2023-03-14

我有以下映射:

public class Content {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "content_id", unique = true, nullable = false)
    private Long contentId;

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "content", cascade = CascadeType.ALL)
    UserContent userContent;
     ....
}
@Entity
@Table(name="user_content")
public class UserContent {
    @GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "content"))
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name = "content_id", unique = true, nullable = false)
    private Long contentId;

    @OneToOne(fetch = FetchType.EAGER)
    @PrimaryKeyJoinColumn
    Content content;
}

和以下道:

 public Set<UserContent> getAllContent() {
        Session session = sessionFactory.getCurrentSession();
        return new HashSet<UserContent>(session.createCriteria(UserContent.class).list());
    }

当在控制器方法中返回此道的结果时,我看到无限递归json:

[{"contentId": 1,"name":"DSC_0029. JPG","版主状态":"IN_PROGRESS","版主评论":""","内容":{"userContent":{"contentId": 1,"name":"DSC_0029. JPG","版主状态":"IN_PROGRESS","版主评论":""","内容":{"userContent":{"contentId": 1,"name":"DSC_0029. JPG","版主状态":"IN_PROGRESS","版主评论":""","内容":{"userContent":{"contentId": 1,"name":"DSC_0029. JPG","版主状态":"IN_PROGRESS","版主评论":""","内容":{"userContent":{"contentId": 1,"name":"DSC_0029. JPG","版主状态":"IN_PROGRESS","版主评论":"","内容":{"userContent"

我尝试如下更改映射:

import com.fasterxml.jackson.annotation.JsonIgnore;

public class Content {
    ...
    @OneToOne(fetch = FetchType.LAZY, mappedBy = "content", cascade = CascadeType.ALL)
    @JsonIgnore        //added this annotation
    UserContent userContent;
    ....

结果:

HTTP状态500-无法写入JSON:未能延迟初始化角色com的集合。航空站领域终端用户。公司,没有关闭任何会话或会话(通过引用链:java.util.HashSet[0]-

我已经阅读了下面的流行答案,但我无法解决我的问题-请帮忙。

Jackson JSON和Hibernate JPA问题的无限递归

共有2个答案

庾鸿飞
2023-03-14

更新:关于无限递归。

你有双向关系,对吗?想象一下json转换你的Content实体类,然后它有一个userContent字段,在UserContent Entity类中它也有一个内容字段,然后它会导致无限递归,这就是为什么你把@JsonIgnore放在你的UserContent字段中忽略该字段以避免无限递归。-秒

我打赌你有私人名单

我赌输了。XD:))

基于这一行。

HTTP Status 500 - Could not write JSON: failed to lazily initialize a collection of role: com.terminal.domain.TerminalUser.companys, 

只需在私有列表中将fetchType设置为Eager

有关更多说明,请参阅此链接。会话未关闭时lazyinitializationexception

齐博厚
2023-03-14

从Jackson 2.0开始,您可以使用@JsonIdtyInfo。检查留档

已更新

...
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")
public class Content {
    ...
}

...
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")
public class UserContent {
    ...
}
 类似资料:
  • 我有过 我通过这种方式传递profileJson: 但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?

  • 我一直在尝试使用: 使用此链接: 但我有一个错误: 当我换成: 是工作。我能做些什么来和日期一起工作? 谢啦

  • 我正在从事一个SpringMVC项目,我需要完成的任务之一是让用户在POST请求中发送一个JSON数据字符串。我知道Spring将使用Jackson对对象反序列化JSON,但如果我尝试以下方法: 我只是返回HTTP 400错误请求(“客户端发送的请求在语法上不正确”)。 如何获取客户端作为字符串发送的原始JSON?

  • 我正在使用Spring形式。我只需要得到Staemap作为响应,但我得到的是整个jsp页面作为响应。

  • 问题内容: 我正在阅读一本书,并在有关控制器的一章中谈到渲染的内容,对于JSON,它有一个类似这样的示例,但没有详细介绍,因此我无法弄清楚该示例所适合的整体情况: 还有使用JSONP和回调函数的示例: 有人可以解释这些吗? 问题答案: 通常,您将返回JSON的原因之一是: A)您正在将部分/全部应用程序构建为单页应用程序(SPA),并且需要客户端JavaScript能够提取其他数据而无需完全重新加

  • 我知道对无限列表进行排序是不可能的,但我正试图为n个数的倍数的无限递增列表写一个定义。 我已经有这个功能了 它返回n的无限倍数列表。但现在我想构建一个函数,给定一个返回列表中所有数字的倍数的无限递增列表。所以函数