Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java REST控制器中具有一对多关系的实体的递归JSON视图_Java_Spring_Rest_Jpa - Fatal编程技术网

Java REST控制器中具有一对多关系的实体的递归JSON视图

Java REST控制器中具有一对多关系的实体的递归JSON视图,java,spring,rest,jpa,Java,Spring,Rest,Jpa,我正在使用SpringBoot和JPA构建REST接口 现在,我为从数据库中获取的产品列表返回了一个奇怪的JSON。假设我有: @Entity public class Product { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn

我正在使用SpringBoot和JPA构建REST接口

现在,我为从数据库中获取的产品列表返回了一个奇怪的JSON。假设我有:

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "categoryId", nullable = false, updatable = false)
    private Category category;

    ...
}

@Entity
public class Category implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy = "category", cascade = CascadeType.DETACH)
    @OrderBy("name ASC")
    private List<Product> products = Collections.emptyList();

    ...
}
在我的控制器中,我有:

@Autowired
private ProductRepository productRepo;

@RequestMapping("/all-products", method = RequestMethod.GET)
public Map<String,Object> home() {
    Map<String,Object> model = new HashMap<String,Object>();
    model.put("products", productRepo.findAll());
    return model;
}
由于表
product
category
之间的关系,我得到一个递归输出,例如:

{"products":[{"id":1,"name":"Product1","category":
{"id":1,"name":"Cat1","products":[{"id":6,"name":"Product6","category":
{"id":1,"name":"Cat1","products":[{"id":6,"name":"Product6","category":
{"id":1,...

我做错了什么?

您没有做错任何事情(至少在代码级别上,这是相当概念性的)-json序列化程序如下所示:

  • 产品-序列化它,但请稍候-有一个类别字段,所以序列化程序必须序列化该类别字段
  • Category-序列化它,但是等待-有一个products字段,所以序列化程序必须序列化列表中的每个产品
  • 产品-因为您的集合包含产品&产品包含类别,所以它会一直循环直到超时
  • 您必须使用视图,或者直接跳过它

  • 使用

  • 将视图用作POJO 返回
    newproductview
    ,该视图包含产品的所有字段和对
    newcategoryview
    的引用(类别)(您可以到此结束),该视图包含(产品)
    newproductview的集合,而不包含引用
    ,依此类推

  • 在一系列产品上使用
    @JsonIgnore


  • 另外,如果它是一个
    @RestController
    ,并且您正在调用“所有产品”,那么返回列表以外的内容就有点不寻常了。将响应包装在映射中是多余的。许多rest客户机在调用
    list()
    方法时需要一个列表。

    我知道这有点晚了,但如果有人遇到同样的问题,请将其添加到这里。 下面是我能找到的另一个相关答案,它讨论了类似的话题

    在这里引用

    1.6有基于注释的支持来处理此类 父/子链接,请参见

    当然,您已经可以排除父链接的序列化了 使用大多数JSON处理包(jackson、gson和flex JSON) 但真正的诀窍在于如何反序列化它 (重新创建父链接),而不仅仅是处理序列化端。虽然 现在看来,排除可能对你有用

    编辑(2012年4月):现在支持true,因此您也可以通过这种方式解决它


    添加@JsonIgnore对我来说很有用

    @OneToMany(mappedBy = "policy")
    @JsonIgnore
    private List<Payment> payments;
    
    @OneToMany(mappedBy=“policy”)
    @杰索尼奥雷
    私人清单付款;
    

    @JeanValjean你是最好的

    @JeanValjean你只需注释一个类的字段,当序列化发生时应该跳过该字段
    @JsonIgnore私有列表产品…
    {"products":[{"id":1,"name":"Product1","category":
    {"id":1,"name":"Cat1","products":[{"id":6,"name":"Product6","category":
    {"id":1,"name":"Cat1","products":[{"id":6,"name":"Product6","category":
    {"id":1,...
    
    @OneToMany(mappedBy = "policy")
    @JsonIgnore
    private List<Payment> payments;