작업 상태
- Jpa 를 이용하고 있었고, todo라는 클래스 체운후 insert 후 결과 값을 json응답으로 응답해주는 메소드 작업중이었습니다.
- 상황은 work:todo=1:N 관계에 있었습니다.
- 에러가 발생하면서 무언가 무한루프가 도는 듯한 느낌도 있었습니다.
에러 메시지
- java.lang.IllegalStateException: getOutputStream() has already been called for this response at org.apache.catalina.connector.Response.getWriter(Response.java:561) at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:226)
- 에러 메시지를 기반으로 상위 filter등을 살폈으나 특이사항은 없었습니다.
원인
at co m.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:733)
at co m.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)
at co m.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
at co m.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:733)
at co m.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)
로그를 살피던 중 이 부분이 무한 루프가 도는 느낌이어서 검색해 보니.. json으로 변환시 Enitty참조문제로 무한 루프가 발생할수 있다고 해서 두개의 Entity Todi, Working을 살펴봤습니다.
@Entity
public class Todo {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "working_id")
private Working working;
}
@Entity
public class Working {
...
@OneToMany(mappedBy = "working", cascade = CascadeType.ALL)
@OrderBy("id DESC")
private List<Todo> todos;
}
검색 결과에서 발견한것 처럼 상호 참조가 있었습니다.
처리
@Entity
public class Working {
...
@OneToMany(mappedBy = "working", cascade = CascadeType.ALL)
@OrderBy("id DESC")
@JsonIgnore // 어노테이션을 사용하여 직렬화에서 제외시킴
private List<Todo> todos;
}