解决返回JSON报错:HttpMessageNotWritableException: Could not write JSON...
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
问题描述: 持久层框架用的是JPA 在Controller返回JSON数据到前端的时候 出现了这个StackOverflowError的错误 即 在将对象转换为JSON格式的数据的时候出现了无限递归调用的情况 如下: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappi 在开发Web应用时,我们经常会遇到将Java对象转化为JSON格式数据以便前端消费的情况。然而,当出现"HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)"这样的错误时,意味着在序列化过程中遇到了无限递归的问题。这个问题通常是由于对象之间的引用循环导致的。在上述例子中,错误信息显示了在`net.zjitc.xxx.pojo.XXX`类的属性之间存在循环引用,导致Jackson库在尝试转化JSON时陷入了无限循环。 我们需要理解Jackson库是如何处理JSON序列化的。Jackson通过`@JsonManagedReference`和`@JsonBackReference`注解来解决双向引用的问题。`@JsonManagedReference`标记在父引用上,`@JsonBackReference`标记在子引用上。这两个注解一起工作,确保在序列化时只处理一次引用关系,从而避免无限递归。 例如,假设我们有两个类`User`和`Address`,它们之间存在一对多的关系: ```java public class User { @Id private Long id; private String name; @OneToMany(mappedBy = "user") @JsonManagedReference private List<Address> addresses; } public class Address { @Id private Long id; private String location; @ManyToOne @JoinColumn(name = "user_id") @JsonBackReference private User user; } ``` 在这个例子中,`User`类中的`addresses`属性被标记为`@JsonManagedReference`,而`Address`类中的`user`属性被标记为`@JsonBackReference`。这样,Jackson在序列化`User`时会忽略`addresses`中的`user`属性,防止无限递归。 如果在你的代码中没有使用这些注解,或者注解没有正确地应用于对象间的引用,就会触发上述错误。为了解决这个问题,你可以按照以下步骤操作: 1. **检查实体类**:确认所有可能造成循环引用的实体类属性,并使用`@JsonManagedReference`和`@JsonBackReference`进行标注。 2. **使用`@JsonIgnore`**:如果你不希望某个属性被序列化,可以使用`@JsonIgnore`注解。这会阻止Jackson处理该属性,从而避免无限递归。 3. **使用`@JsonIdentityInfo`**:对于复杂的情况,可以使用`@JsonIdentityInfo`注解来定义一个属性作为对象的标识,以消除循环引用。例如: ```java @Entity @JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class User {...} @Entity @JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class Address {...} ``` 4. **自定义序列化/反序列化逻辑**:如果你需要更精细的控制,可以创建自定义的`JsonSerializer`和`JsonDeserializer`,并在需要的字段上使用`@JsonSerialize`和`@JsonDeserialize`注解。 5. **配置Jackson ObjectMapper**:在Spring Boot中,你可以通过配置`ObjectMapper`的设置来处理无限递归,例如启用`@JsonAutoDetect`的`isGetterVisibility`或`isSetterVisibility`,或者禁用默认类型引用。 修复这些问题后,你应该能够成功地将对象转化为JSON,而不会触发`StackOverflowError`。记住,每次修改后都要重新构建并测试应用程序,以确保问题已经得到解决。同时,确保在开发过程中保持良好的代码结构和设计,避免过度依赖导致的复杂性,这也能有效预防此类问题的发生。
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![apk](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![h](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 5
- 资源: 962
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)