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

如何在Spring Boot中使用JsonIgnore来停止无限循环?[重复]

井镜
2023-03-14

在我的项目中,用户和产品之间存在多对多关系。一个用户可以拥有许多产品,一个产品可以被许多用户拥有。

使用者JAVA

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable( name = "user_product",
                joinColumns = @JoinColumn(name = "user_id"),
                inverseJoinColumns = @JoinColumn(name = "product_id"))
    private List<Product> listOfProductsForUser;

Product.java

    @JsonIgnore
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "listOfProductsForUser")
    private List<User> listOfUsersForProduct;

在我的控制器中,我有一个路径,可以让我获得所有用户以及与用户相关联的嵌套产品,如下所示。

[
    {
        "userId": 1,
        "userName": "Fido",
        "age": 3,
        "listOfProductsForUser": [
            {
                "productId": 1,
                "productName": "tooth brush",
            },
            {
                "productId": 2,
                "productName": "potatoes",
            },
            {
                "productId": 3,
                "productName": "carrot",
            }
        ]
    },
    {
        "userId": 2,
        "userName": "David",
        "age": 12,
        "listOfProductsForUser": [
            {
                "productId": 6,
                "productName": "oranges",
            },
            {
                "productId": 7,
                "productName": "tomatoes",
            },
            {
                "productId": 6,
                "productName": "buns",
            }
        ]
    }
]

这很好,但我现在想获取所有应该有嵌套用户的产品(获取所有产品并查看哪些用户正在使用它们)。在尝试这样做时,我遇到了一个递归问题,我在产品上使用了JsonIgnore。java的ListofProductsfourser变量停止递归。我怎样才能做到这一点?

共有2个答案

廖臻
2023-03-14

尝试以下方法:

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable( name = "user_product",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "product_id"))
@JsonManagedReference
private List<Product> listOfProductsForUser;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "listOfProductsForUser")

@JsonBackReference
private List<User> listOfUsersForProduct;

这两个注释(@JsonManagedReference和@JsonBackReference)避免了无限递归。

我误解了这个问题。JSON中应该同时存在listofursforproductlistofursforruser。前面的解决方案省略了listOfUsersForProduct。要同时拥有这两个功能,您需要使用@ray建议的@JsonIdentityInfo

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "userId")
public class User { }
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "productId")
public class Product { }
车思淼
2023-03-14

有几种方法可以处理这种双向关系问题。我认为@JsonIdtyInfo是您的最佳方式。

您需要做的是更改用户产品类,如下所示。

//other annotations
@JsonIdentityInfo(
  generator = ObjectIdGenerators.PropertyGenerator.class, 
  property = "userId")
public class User {
    // your code
}
//other annotations
@JsonIdentityInfo(
  generator = ObjectIdGenerators.PropertyGenerator.class, 
  property = "productId")
public class Product {
    // your code
}

注意:更多信息请点击此处

 类似资料:
  • 启动无限循环后,我无法关闭JFrame。 我想停止无限循环使用停止按钮。 我用开始按钮开始一个无限循环。我想用“停止”按钮关闭那个回路。 > if(stop.getModel(). isP的()){中断;}不工作 actionListener用于识别按钮单击并在循环也不起作用时使用中断语句终止 点击停止按钮,无限循环必须终止。在使用start Button启动无限循环后,我无法使用JFrame中的

  • 我正在尝试做一个数字猜测游戏,如果用户匹配他们赢得现金的幸运数字,游戏将继续进行,直到他们用完现金。他们每打一轮都要付赌注。每一轮都会产生一个新的随机数。 我只想使用一个输入。当我把输入放在循环中,循环无限停止循环,当我把它放在循环外,它无限开始循环。我该怎么阻止这一切?我需要向while循环添加什么?我尝试突破,但我想继续比赛,直到钱用完。 我只想使用一个输入,但是当我把输入带出循环(lucky

  • 不知道如何阻止这个while循环无限重复。我使用检查用户输入是否为int。如果没有输入int值,则循环将无限重复。

  • 问题内容: 我有一个运行在无限循环上的脚本,并将其添加到数据库中,并且执行了一些我不能只停止一半的事情,所以我不能只按ctrl + C并停止它。 我希望能够以某种方式停止while循环,但是让它在停止之前完成最后一次迭代。 让我澄清一下: 我的代码看起来像这样: 我希望能够在结束或开始时中断while循环,但不要在执行操作之间中断,因为那样会很不好。 而且我不希望它在每次迭代后问我是否要继续。 感

  • 我有一个程序,它每秒钟响一次,直到停止。问题是,在我按下“开始”并发出嘟嘟声后,我无法单击“停止”按钮,因为窗口冻结。欢迎任何帮助。

  • 问题内容: 有没有一种方法可以停止执行无限循环的线程? 问题答案: 是的,您可以将替换(或在逻辑上)。 这样,当任务取消时,循环将终止。 循环看起来像这样: 使用应该是这样的: