gpt4 book ai didi

java - Json 和 Java - 循环引用

转载 作者:太空狗 更新时间:2023-10-29 22:42:42 26 4
gpt4 key购买 nike

我对通函引用有疑问。

我有将对象返回到前端的 Rest Web 服务,问题是当我尝试返回具有多个引用的对象时,结果我得到了无限响应,这生成了

java.lang.IllegalStateException: 
Cannot call sendError() after the response has been committed

对象由 Hibernate 代码生成自动生成,我需要在后端有循环引用,我只需要在使用 Jackson 将信息发送到前端之前将其删除。

Controller 方法头是:

@RequestMapping(value="/list", method=RequestMethod.POST)
public @ResponseBody eventResponse list(@RequestBody String sessionID) {

我没有做任何明确的事情来转换为 Json,我是这方面的新手,我认为 jackson 自动解决了这个问题。

最佳答案

有两种方法可以解决这个问题。如果您必须将您的实体暴露给外界,我建议添加 @JsonIgnore在导致循环引用的属性上。这将告诉 Jackson 不要序列化该属性。

另一种方法是使用 Jackson 提供的双向功能。您可以使用 @JsonManagedReference@JsonBackReference . @JsonManagedReference 是属性的“转发”部分,它将正常序列化。 @JsonBackReference 是引用的“后退”部分;它不会被序列化,但会在“forward”类型被反序列化时被重构。

您可以查看示例 here .

这解决了您的意见:我认为在这种情况下您可能想要做的是使用对外界可见的 DTO。我喜欢这种方法,因为我不想将我的实体暴露给外部。这意味着 Jackson 注释将在 DTO 而不是实体上。您需要某种将实体转换为 DTO 的映射器或转换器。现在,当您对实体进行更改时,除非您修改映射器/转换器,否则它们不会传播到 DTO。我认为这没问题,因为当您对实体进行更改时,您可以决定是否要公开该更改。

更新

有一篇很好的博文here其中详细介绍了在 Jackson 中处理双向关系的各种方式。它描述了使用 @JsonIgnore@JsonManagedReference@JsonBackReference@JsonIdentityInfo@JsonView 的解决方案 和自定义序列化程序。这是一篇非常全面的文章,介绍了您可以使用的各种技术。

关于java - Json 和 Java - 循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17393812/

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