问题:
使用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"),解决问题。