Java REST控制器中具有一对多关系的实体的递归JSON视图
我正在使用SpringBoot和JPA构建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
@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序列化程序如下所示:
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;