其余资源与Spring Boot之间的关系

时间:2018-08-17 12:16:10

标签: json spring rest spring-boot

我正在学习Spring Boot Rest,但无法解决问题。有人能帮我吗? 我在Product和Category实体之间创建了以下映射:

类别实体:

@Entity
public class Category {
 ...
@JsonIgnore
@OneToMany(mappedBy="category")
private List<Product> products;
//getters setters
}

产品实体:

@Entity
@Table(name="lancamento")
public class Lancamento {
...
@NotNull
@ManyToOne
@JoinColumn(name="id_pessoa")
private Pessoa pessoa;
//getters setters
}

我等待这个结果:

{
 "name":"Category_1",
  "products":[
     {
       "id":"1",
       "name":"Product_1"
     },
     {
      "id":"2",
       "name":"Product_2"
     },
   ]
}

但实际结果是:

{
 "name":"Category_1"
}

怎么了?我需要进行一些设置吗? 谢谢。

5 个答案:

答案 0 :(得分:2)

尝试删除@JsonIgnore批注。使用此注释,您可以告诉Spring在序列化/反序列化对象时基本上忽略该字段,因此它不会出现在输出中。

See the Docs

答案 1 :(得分:0)

您在类别的产品字段上具有JsonIgnore

答案 2 :(得分:0)

删除@JsonIgnore注释。

由于有@JsonIgnore注释,此列表被忽略了。

请参阅此https://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonIgnore.html以了解@JsonIgnore

答案 3 :(得分:0)

您必须移动@JsonIgnore并使用DTO对象进行序列化。无论如何,这是创建API的正确方法。您可以根据需要合并和转换DTO中实体的所有数据。

OR

您可以将反向关系(字段)设置为Product对象,例如

@JsonIgnore
@ManyToOne
private Category category;

并用@Json标记忽略该字段。

由您决定,但是更好的方法是使用DTO

答案 4 :(得分:0)

非常感谢,我在Infinite Recursion with Jackson JSON and Hibernate JPA issue找到了解决方案

这种情况的解决方案是使用Jackson批注:@JsonManagedReference和@JsonBackReference。

类别:

@Entity
public class Category {
...
@JsonManagedReference 
@OneToMany(mappedBy="category")
private List<Product> products;
//getters setters
}

产品

@Entity
public class Product {
...

@JsonBackReference
@NotNull
@ManyToOne
@JoinColumn(name="id_product")
private Product product;
//getters setters
}

这就像我需要的那样。