이게 머임 ㅜ
Failure while trying to resolve exception [org.springframework.http.converter.HttpMessageNotWritableException]
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)] with root cause
java.lang.StackOverflowError: null
현재 상황 :
글 수정하는데 오류 발생. 편집 화면에서 넘어가지 않고 멈춤. DB확인해보니 수정된 내용 반영됨.
콘솔 예외처리 내용 :
ChatGPT에 상담함 :
-> 뭐라는지 잘 몰겠음.. 대충 내부적으로 오류가 발생하면 HttpServletResponse에서 sendError()로 응답을 작성해 보내는데, 그전에 이미 응답이 커밋돼서 메시지를 못 보낸다는 오류인듯.
-> 또 스택 오버플로우는 왜 일어나는 ㅇㄴ;
-> Jackson? 직렬화? \(´◓Д◔)/
Entity나 dto 문제인건가??
-> Entity간 양방향 참조를 쓰고 있긴하다... 체킹체킹,,
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "user_m_tb")
public class User {
...
//post와 양방향 관계 설정
@OneToMany(mappedBy = "user")
private List<Post> posts = new ArrayList<>();
//reply와 양방향 관계 설정
@OneToMany(mappedBy = "user")
private List<Reply> replies = new ArrayList<>();
}
오... 일단 메이저한 오류의 원인은 찾은 것같다. 컨트롤러에서 ResponseEntity<> 형태로 안에 객체 데이터를 넣어 보내는데, @ResponseBody로 Jason 변환을 하며 순환참조가 일어난 것 같다.
⬇ ⬇ ⬇ 너무 잘 설명해준 포스팅이라 참고!!
https://k3068.tistory.com/32
@JsonIdentityInfo
어노테이션을 사용해 Jason 변환시, @Id를 바탕으로 중복된 아이디를 가진 객체는 Jason으로 변환시키지 않도록 했다.@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "userCode")
public class User {
...
//post와 양방향 관계 설정
@OneToMany(mappedBy = "user")
private List<Post> posts = new ArrayList<>();
//reply와 양방향 관계 설정
@OneToMany(mappedBy = "user")
private List<Reply> replies = new ArrayList<>();
}
이런식으로 모든 엔티티에 추가 完 !
메이저한 버그를 수정했더니 오류가 일어나지 않아 두 번 확인하지는 못했다. 진짜 무슨 오류였던 거임?
이건 추후 다시 알아봐야할 거같다.