복붙노트

[SPRING] Spring :이 응답에 대해 getOutputStream ()이 이미 호출되었습니다.

SPRING

Spring :이 응답에 대해 getOutputStream ()이 이미 호출되었습니다.

나는 다른 많은 게시물들이 매우 똑같은 오류를 다루고 있다는 것을 알고있다. 그러나 그것들 모두는 JSP / GSP 페이지에 관한 것이거나 다른 경우에는별로 도움이되지 않는다. Thymeleaf와 함께 Spring MVC를 사용하고 있습니다. 다음 기능은 파일을 다운로드하는 기능입니다.

@RequestMapping(value = "/test/download/*", method = RequestMethod.GET)
public String getFile(HttpServletResponse response)
{

    ServletOutputStream stream = null;
    try
    {
        stream = response.getOutputStream();

        MultipartFile f = test.getFile();

        InputStream is = f.getInputStream();
        IOUtils.copy(is, stream);
        response.flushBuffer();

        stream.flush();
        stream.close();

    } catch(Exception ex)
    {

    }

    return "test";

}

실제로 작동하기 때문에 문제는별로 없지만 콘솔에서는 항상 다음과 같은 오류가 발생합니다.

2014-01-10T09:28:09.053+0100  SEVERE  Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception  [Request processing failed; nested exception is java.lang.IllegalStateException: getOutputStream() has already been called for this response] with root cause
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:638)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:214)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105)
at org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper.getWriter(SaveContextOnUpdateOrErrorResponseWrapper.java:125)
at org.thymeleaf.spring3.view.ThymeleafView.renderFragment(ThymeleafView.java:335)
at org.thymeleaf.spring3.view.ThymeleafView.render(ThymeleafView.java:190)
[...]

지금까지 보았 듯이 getOutputStream ()은 한 번만 호출됩니다. 또한 전체 함수는 try-catch 블록으로 둘러 쌓여 있습니다. 그래서 나는이 오류가 어디서 왔는지 알고 싶습니다.

해결법

  1. ==============================

    1.'test'를 반환하면, outputStream을 사용하여 이진 파일을 반환 한 후 컨트롤러에 지시를 보냅니다. 어떻게 이것을 관리해야하는지에 대한 아이디어가 있습니다.

    'test'를 반환하면, outputStream을 사용하여 이진 파일을 반환 한 후 컨트롤러에 지시를 보냅니다. 어떻게 이것을 관리해야하는지에 대한 아이디어가 있습니다.

    스프링 컨트롤러에서 파일 다운로드

  2. ==============================

    2.방금이 문제가 발생했습니다.

    방금이 문제가 발생했습니다.

    이 문제는 컨트롤러 메소드가 종료 될 때 String (뷰 이름)의 리턴 유형을 시도하여 발생합니다. 메소드가 종료되면 두 번째 응답 스트림이 시작됩니다.

    컨트롤러 메소드 반환 유형을 void로 변경하면 문제가 해결되었습니다.

    다른 사람들이이 문제를 경험하면 도움이되기를 바랍니다.

  3. ==============================

    3.String을 보내기 원한다면 변경할 수 있습니다.

    String을 보내기 원한다면 변경할 수 있습니다.

    return "test";
    

    return null;
    
  4. from https://stackoverflow.com/questions/21039471/spring-getoutputstream-has-already-been-called-for-this-response by cc-by-sa and MIT license