我收到错误“无法编写 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>{
}