java.lang.IllegalStateException: getOutputStream() has already been called for this response

问题:

使用springboot完成项目的时候,逻辑代码全部正确,在最后一步return返回值的时候报错,错误如下:

  at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) ~[jackson-databind-2.8.11.3.jar:2.8.11.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:689) ~[jackson-databind-2.8.11.3.jar:2.8.11.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.8.11.3.jar:2.8.11.3]

at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:112) ~[jackson-databind-2.8.11.3.jar:2.8.11.3]
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25) ~[jackson-databind-2.8.11.3.jar:2.8.11.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) ~[jackson-databind-2.8.11.3.jar:2.8.11.3]
重复错误信息太多,此处省略......
Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:583) ~[tomcat-embed-core-8.5.42.jar:8.5.42]
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211) ~[tomcat-embed-core-8.5.42.jar:8.5.42]
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) ~[tomcat-embed-core-8.5.42.jar:8.5.42]
    at org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView.render(ErrorMvcAutoConfiguration.java:230) 

解决:

本以为Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response会是有用信息,结果查了很多资料,也不知道为啥报错。最后转换思路,因为debug发现就是在return结果的时候报的错,所以就初步判定是@ResponseBody的时候出错了,但是不知道为什么转成json的时候会报错,最后百度了第一行的抱错信息,发现是因为我的实体类中有关联关系,导致转成json的时候出现了死循环。实体类如下:

ExtractResources 与ExtractTemplate 是一对多的关系

@Entity
@Table(name = "extract_resources")
public class ExtractResources implements Serializable {

   省略其他属性.........
    
    @OneToMany(mappedBy = "extractResources")
    private Set<ExtractTemplate> extractTemplates;    

}

--------------

@Entity
@Table(name = "extract_template")
public class ExtractTemplate implements Serializable {

   省略其他属性.........

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "resource_id", insertable = false, updatable = false)
    private ExtractResources extractResources;

}

最后,在ExtractResources实体上加上注解@JsonIgnoreProperties(value = "extractTemplates"),解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值