gpt4 book ai didi

java - REST Controller 中具有一对多关系的实体的递归 JSON View

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:11:40 26 4
gpt4 key购买 nike

我正在使用 SpringBoot 和 JPA 构建 REST 接口(interface)。

现在,我为从数据库中获取的产品列表返回了一个奇怪的 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();

...
}

Product 的 JPA 存储库定义为:

public interface ProductRepository extends JpaRepository<Product, Long> {
List<Product> findAll();
}

在我的 Controller 中我有:

@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;
}

让我发疯的是,如果我尝试按如下方式调用此服务:

$ curl localhost:8080/all-products

由于表 productcategory 之间的关系,我得到一个递归输出,例如:

{"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 序列化器就是这样的:

  1. Product - 序列化它,但是等等 - 有一个类别字段,所以序列化程序必须序列化类别字段
  2. 类别 - 序列化它,但是等等 - 有一个产品字段,因此序列化程序必须序列化列表中的每个产品
  3. 产品 - 因为您的集合包含产品并且产品包含类别,所以它会无限循环直到超时。

您必须使用 View 或跳过它。

  1. 使用 @JsonView

  2. 将 View 用作 POJO返回包含产品所有字段的 new ProductView 和对包含(产品) 集合的 new CategoryView 的引用(类别)(您可以在此处结束)新的 ProductViewWithoutReferences,等等

  3. 对产品集合使用@JsonIgnore

作为旁注 - 如果它是一个 @RestController 并且您正在调用“所有产品”,那么返回列表以外的东西有点不寻常。将响应包装在 map 中是多余的。许多 rest 客户端在调用 list() 方法时期望得到一个列表。

关于java - REST Controller 中具有一对多关系的实体的递归 JSON View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31465440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com