在REST控制器中,对具有一对多关系的实体进行递归JSON视图。

20 浏览
0 Comments

在REST控制器中,对具有一对多关系的实体进行递归JSON视图。

我正在使用SpringBoot和JPA来构建一个REST接口。\n现在,我从数据库中获取到的产品列表返回了一个奇怪的JSON。假设我有以下内容:\n@Entity\npublic class Product {\n @Id\n @GeneratedValue(strategy = GenerationType.AUTO)\n private Long id;\n @ManyToOne(optional = false, fetch = FetchType.LAZY)\n @JoinColumn(name = \"categoryId\", nullable = false, updatable = false)\n private Category category;\n ...\n}\n@Entity\npublic class Category implements Serializable {\n @Id\n @GeneratedValue(strategy = GenerationType.AUTO)\n private Long id;\n @OneToMany(mappedBy = \"category\", cascade = CascadeType.DETACH)\n @OrderBy(\"name ASC\")\n private List products = Collections.emptyList();\n ...\n}\nProduct的JPA repository定义如下:\npublic interface ProductRepository extends JpaRepository {\n List findAll();\n}\n我的控制器中有:\n@Autowired\nprivate ProductRepository productRepo;\n@RequestMapping(\"/all-products\", method = RequestMethod.GET)\npublic Map home() {\n Map model = new HashMap();\n model.put(\"products\", productRepo.findAll());\n return model;\n}\n让我疯狂的是,如果我尝试调用以下服务:\n$ curl localhost:8080/all-products\n由于表product和category之间的关系,我得到了一个递归输出,例如:\n{\"products\":[{\"id\":1,\"name\":\"Product1\",\"category\":\n{\"id\":1,\"name\":\"Cat1\",\"products\":[{\"id\":6,\"name\":\"Product6\",\"category\":\n{\"id\":1,\"name\":\"Cat1\",\"products\":[{\"id\":6,\"name\":\"Product6\",\"category\":\n{\"id\":1,...\n我做错了什么?

0
0 Comments

问题的原因是在REST控制器中,当实体存在一对多关系时,以递归的JSON视图查看实体时出现问题。解决方法是添加一个注解来映射实体的关系,并在实体类中声明一个列表来存储关系对象。

(mappedBy = "policy")
private List payments;

这样做可以让JSON视图正确地显示实体的关系。

0
0 Comments

在REST控制器中查看具有一对多关系的实体的递归JSON视图的问题的原因是,处理父/子链接的反序列化。解决方法是使用Jackson 1.6注释支持处理此类父/子链接。另外,现在Jackson 2.0还支持真正的身份引用,可以通过这种方式解决该问题。

以下是原始内容的整理:

在REST控制器中查看具有一对多关系的实体的递归JSON视图的问题的原因是,处理父/子链接的反序列化。解决方法是使用Jackson 1.6注释支持处理此类父/子链接。另外,现在Jackson 2.0还支持真正的身份引用,可以通过这种方式解决该问题。

参考答案中提到了一个相关的问题,讨论了类似的主题。可以在以下链接中找到相关答案:https://stackoverflow.com/a/3359884/6785908

引用答案中的内容如下:

Jackson 1.6具有基于注释的支持,用于处理此类父/子链接关系,参见http://wiki.fasterxml.com/JacksonFeatureBiDirReferences。当然,您当然可以使用大多数JSON处理程序(jackson、gson和flex-json至少支持)来排除父链接的序列化,但真正的技巧在于如何反序列化回来(重新创建父链接),而不仅仅是处理序列化方面。尽管现在听起来只是排除可能对您有用。

编辑(2012年4月):Jackson 2.0现在支持真正的身份引用,因此您也可以通过这种方式解决它。

0
0 Comments

问题的原因是在REST控制器中,存在一个实体与一对多关系的递归JSON视图。JSON序列化程序在处理此类关系时会进入无限循环,导致超时。解决方法有三种:使用视图、使用POJO作为视图,或在产品集合上使用@JsonBackReference注解。

首先,可以使用Jackson的视图功能来解决这个问题。可以参考Spring的文档(https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring)了解如何使用视图来序列化实体。通过使用视图,可以控制序列化过程中要包含的字段,从而避免递归关系导致的无限循环。

另一种解决方法是创建一个POJO作为视图。在这个POJO中,可以包含产品的所有字段,并添加一个对类似Category的引用。然后,在Category的POJO中,可以添加对类似Product的引用,以此类推。通过这种方式,可以避免递归关系导致的无限循环。

最后,可以在产品集合上使用@JsonBackReference注解。这个注解告诉JSON序列化程序在处理关系时跳过被注解的字段。在这种情况下,可以在产品类中的集合字段上添加@JsonBackReference注解,以避免无限循环。

需要注意的是,如果返回的是一个列表,那么在REST控制器中,如果使用了@RequestMapping注解,并且方法名称为"all-products",那么返回的应该是一个列表,而不是将列表包装在一个映射中。这样可以与REST客户端的预期相匹配。

解决这个问题的方法包括使用视图、使用POJO作为视图以及在集合字段上使用@JsonBackReference注解。通过采用这些方法,可以避免JSON序列化中的递归关系导致的无限循环。

0