작업 상태

- 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등을 살폈으나 특이사항은 없었습니다.

java.lang.IllegalStateException: getOutputStream()

원인

        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; 
}

 

+ Recent posts