使用 Set 而不是 List 会导致“无法写入 JSON:无限递归”异常

2024-06-25

我收到错误“无法编写 JSON:无限递归”当尝试访问端点时http://localhost:8080/categoryOfPermissions http://localhost:8080/categoryOfPermissions。我研究并找到了各种解决方案here https://stackoverflow.com/questions/47693110/could-not-write-json-infinite-recursion-stackoverflowerror-nested-exception (@JsonManagedReference / @JsonBackReference, @JsonIgnore, @JsonIdentityInfo),但它们似乎都不起作用。最后,我找到了一个answer https://stackoverflow.com/a/57055767/4077150指出有必要从 Set 更改为 List,以便@JsonIdentityInfo解决方案来工作。我测试了它,从“设置”更改为“列表”后,它确实开始工作。

我觉得很奇怪,但我发现了更奇怪的事情:从 Set 更改为 List 后,我​​删除了@JsonIdentityInfo注释和一切都继续工作。换句话说,我真正需要做的就是从 Set 更改为 List 以消除异常。没有其他的。不需要任何解决方案:@JsonManagedReference / @JsonBackReference, @JsonIgnore, @JsonIdentityInfo.

下面是产生异常的代码。我所要做的就是改变private Set<Permission> permission to private List<Permission> permission.

我想知道为什么,特别是因为我更喜欢使用 Set,以避免 Hibernate 使用“Bags”范例(这可能会导致一些不良行为 https://stackoverflow.com/a/17950928/4077150).

权限.java:

@Entity
@Data
public class Permission{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotBlank
    private String name;
            
    @NotNull    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "category_of_permission_id")
    private CategoryOfPermission categoryOfPermission;    
}

CategoryOfPermission.java :

@Entity
@Data
public class CategoryOfPermission{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotBlank
    private String name;
            
    @NotNull    
    @OneToMany(mappedBy = "categoryOfPermission", fetch=FetchType.LAZY)
    private Set<Permission> permission;
}

CategoryOfPermissionRepo.java :

public interface CategoryOfPermissionRepo extends CrudRepository<CategoryOfPermission, Integer>{
}

这是因为Set in Java uses equals判断两个对象是否相同的契约,以及方法equals中的方法Permission类已实现(使用lombok) 导致无限递归。

它是生成代码的一部分equals中的方法Permission

    Object this$categoryOfPermission = this.getCategoryOfPermission();
    Object other$categoryOfPermission = other.getCategoryOfPermission();
    if (this$categoryOfPermission == null) {
      if (other$categoryOfPermission != null) {
        return false;
      }
    } else if (!this$categoryOfPermission.equals(other$categoryOfPermission)) {
      return false;
    }

这是生成的代码CategoryOfPermission class

public boolean equals(final Object o) {
    if (o == this) {
      return true;
    } else if (!(o instanceof CategoryOfPermission)) {
      return false;
    } else {
      CategoryOfPermission other = (CategoryOfPermission)o;
      if (!other.canEqual(this)) {
        return false;
      } else {
        Object this$id = this.getId();
        Object other$id = other.getId();
        if (this$id == null) {
          if (other$id != null) {
            return false;
          }
        } else if (!this$id.equals(other$id)) {
          return false;
        }

        Object this$permission = this.getPermission();
        Object other$permission = other.getPermission();
        if (this$permission == null) {
          if (other$permission != null) {
            return false;
          }
        } else if (!this$permission.equals(other$permission)) {
          return false;
        }

        return true;
      }
    }
  }

如你所见Permission班级电话equals的方法CategoryOfPermission类和CategoryOfPermission calls equals的方法Permision最终导致 stackoverflow 问题的类!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Set 而不是 List 会导致“无法写入 JSON:无限递归”异常 的相关文章

随机推荐

  • Objective-C 中的前向声明枚举

    我在 Objective C 程序中的枚举可见性方面遇到问题 我有两个头文件 其中一个定义了typedef enum 另一个文件需要使用typedef d type 在直C中 我会简单地 include另一个头文件 但在 Objective
  • 如何消除错误 服务无效 请检查您的设置并尝试

    我一直在努力工作 一切都很顺利 只是突然间 当我尝试构建我的项目时 我在 xCode 中收到以下错误 1 在构建时的警报框中 服务无效 请检查您的设置并重试 0xE8000022 只需重新启动您的 iPod 或 iPhone 即可
  • const_cast 的奇怪行为[重复]

    这个问题在这里已经有答案了 考虑以下代码 我声明了一个新的引用端 通过 const cast 将其分配给 a 值 然后我只需增加参考值打印地址和值 include
  • 如何在iis上部署React Next.JS?

    我有一个带有 Next Js 的 React Web 应用程序 我想将其上传到我的 IIS ftp 上 我应该复制 next 文件夹吗 如果是 为什么我在这种情况下会出错 错误截图 您可以在服务器上创建一个本地主机并将请求重定向到该本地主机
  • splice() 不更新 knockout.js 中数组的项目顺序

    继之前的帖子 https stackoverflow com questions 10258086 how do i swap two items in an observablearray关于如何更新数组的顺序 我遵循 Michael B
  • getMacAddress() 在 Android 11 中返回 null?如何获取Android 11的mac地址?

    try List
  • 在php中将png合并到多边形上

    我很困惑 我尝试简单地绘制一个多边形并放在上面 就像一个带有透明度的 png 图层一样 没有任何成功 一次背景是黑色的 一次多边形变得不可见 这是我的 php 代码 header Content type image png The png
  • 使用 pandas 覆盖 Excel 列同时保持格式

    我正在使用一个 xlsx 文件 如下所示 我之前的任务是修改名为 Entry 1 和 Entry 2 的列 我已将这些列存储在原始数据帧的单独切片中 以便更好地概览 我将让您快速浏览一下该切片的外观 gt gt gt slice df lo
  • 将 \n 替换为 Sublime Text 中的实际新行

    我该如何更换 n在 Sublime Text 中 真正的编辑器显示新行 如下所示 foo nbar becomes foo bar 当我查看编辑器中的文件时 Turn on Regex Search and Replace icon mos
  • 将布尔值转换为整数值php

    PHP 是否有任何内置函数可以接受布尔值并返回其等效整数 0 代表假 1 代表真 当然 您可以轻松创建一个函数来执行此操作 我只是问 PHP 内部是否有内置函数 我已经尝试过了intval 并将其投射到 int 但它们不起作用 在 TRUE
  • ReSharper 和 Rational Team Concert (RTC) - 它们配合得很好吗?

    我最近加入了一个小型开发团队 该团队正在考虑新的版本控制系统 由于它是大型组织的一部分 因此我们很可能采用 Rational Team Concert 的公司标准 我建议他们应该选择更简单的东西 但我可能不会如愿 我主要担心它无法与 ReS
  • Python Celery - 通过 pid 查找任务

    也许是一个非常简单的问题 我经常看到我的系统上运行着一个celery任务进程 但我在使用时却找不到celery task control inspect s active 方法 通常这个进程会运行几个小时 我担心它是某种僵尸 通常它也会消耗
  • 递归分层父子

    我有一个来自数据库的项目集合 该数据库具有parentid值或空 这是我的班级设计 public class Item public int id get set public string Name get set public int
  • 从父节点读取特定叶/子节点的 Firebase 规则

    我的 firebase 数据库看起来像这样 students firebase key 1 Name blah blah Address blah blah Roll No blah blah Marks Sub1 blah Sub2 bl
  • asp.net MVC - 如何通过不同的存储库类共享 SqlConnection 的同一实例

    我正在使用 MVC5 和普通 ADO NET 创建一个新项目 只是作为学习练习 我需要创建一个存储库 用于注册一个模型 其中包含几个也需要同时创建的相关对象以及这些对象反过来可能需要插入其他对象 我能想到的最简单的解决方案是拥有一个庞大的方
  • Puppeteer - 如何获取当前页面(应用程序/pdf)作为缓冲区或文件?

    使用 Puppeteer https github com GoogleChrome puppeteer https github com GoogleChrome puppeteer 我有一个页面是申请 pdf With headless
  • 高效滚动最大和最小窗口

    我想有效地计算滚动最大值和最小值 这意味着比每次窗口移动时从使用的所有值重新计算最大值 最小值更好 这里有一篇文章问了同样的问题 有人发布了一个涉及某种堆栈方法的解决方案 据说该方法是根据其评级来工作的 然而我这辈子都找不到它了 在寻找解决
  • 在RelativeLayout android中使用java动态改变TextView的位置

    我有RelativeLayout 并且RelativeLayout中有一个textview 我从服务器获取位置 如ALIGN PARENT LEFT ALIGN PARENT TOP 基于该值我想更改textview的位置 我的 xml 文
  • NSDate 输出不正确[重复]

    这个问题在这里已经有答案了 可能的重复 获取日期与 NSDate date 相差几个小时 https stackoverflow com questions 8466744 getting date from nsdate date off
  • 使用 Set 而不是 List 会导致“无法写入 JSON:无限递归”异常

    我收到错误 无法编写 JSON 无限递归 当尝试访问端点时http localhost 8080 categoryOfPermissions http localhost 8080 categoryOfPermissions 我研究并找到了