티스토리 뷰

public void memberExceptionHandler(HttpServletResponse response, String msg, int statusCode) {
    response.setStatus(statusCode);
    response.setContentType("application/json");
    try {
        String json = new ObjectMapper().writeValueAsString(new SecurityExceptionDto(statusCode, msg));
        response.getWriter().write(json);
    } catch (Exception e) {
        log.error(e.getMessage());
    }
}

 

위 코드를 작성하고 두 번 연속으로 요청을 보내니

java.lang.IllegalStateException: getWriter() has already been called for this response 에러가 나왔다.

 

위 에러는 getWriter()가 HttpServletResponse 객체에서 한 번 호출된 다음에 취소하지 않고 호출하면 발생하는 에러라고 한다.

 

response.getWriter().write(json)이라는 코드를 쓰지 않고 json을 넘겨줄 수 있는 코드가 있는지를 찾아보니

response.getOutputStream().write(json.getBytes())라는 코드가 있었다.

 

response.getWriter().write(json)은 문자 단위 출력을 제공하며 출력 형식이 스트링,

response.getOutputStream().write(json.getBytes())은 바이트 단위 출력을 제공하며 출력 형식이 바이트 배열이라는 차이가 있다고 한다.

 

이렇게 하니 문제가 해결되긴 했지만 정확히 어떤 이유로 해결되었는지는 아직 모르겠다..

그래서 그냥 이 코드는 사용하지 않고 dto로 상태코드와 메시지를 넘기고 setStatus를 통해 상태코드만 브라우저에서 동일하게 나올 수 있도록 잡아주었다.

댓글