java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:472) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:129) ~[tomcat-embed-core-9.0.65.jar:4.0.FR]
at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:129) ~[tomcat-embed-core-9.0.65.jar:4.0.FR]
at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:129) ~[tomcat-embed-core-9.0.65.jar:4.0.FR]
at org.springframework.security.web.util.OnCommittedResponseWrapper.sendError(OnCommittedResponseWrapper.java:116) ~[spring-security-web-5.7.3.jar:5.7.3]
...
Member 객체를 활용하여 내 그룹들을 조회하는 API를 구현하는 과정에서 발생한 오류이다. TeamMember라는 Entity에서 TeamMember를 조회하는 데에 문제가 생긴 것이었다.
@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
@Column(nullable = false)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String nickname;
@OneToMany(mappedBy = "member")
private List<PersonalSchedule> personalScheduleList;
@OneToMany(mappedBy = "member")
private List<TeamMember> teamMemberSet;
}
@Entity(name = "team")
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "team_id")
private Long id;
@Column(nullable = false)
private String name;
@OneToMany(mappedBy = "team", fetch = FetchType.LAZY)
private List<TeamSchedule> teamScheduleList;
@OneToMany(mappedBy = "team", fetch = FetchType.LAZY)
private List<TeamMember> teamMemberList;
public void updateName(String name) {
this.name = name;
}
}
@Entity
@Getter
@Builder
@IdClass(TeamMemberId.class)
@NoArgsConstructor
@AllArgsConstructor
public class TeamMember {
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="team_id")
private Team team;
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="member_id")
private Member member;
@Enumerated(EnumType.STRING)
private TeamRole teamRole;
}
해당 오류는 Java에 JSON 타입 변환 과정 중 일어나는 오류라고 한다.
테이블과 테이블이 연관관계에 있으며 이를 mode.addAttribute 메소드를 통해 데이터를 Front로 보낼 때 Json으로 변환하는 과정 중에 무한으로 참조가 순환되어 일어나는 오류라고.
이는 해당 연관관계 매핑 부분에 @JsonIgnore를 붙여 순환참조관계를 막아 간단히 해결할 수 있다.