質問

私は同じエラーを扱う他の多くの投稿があることを知っていますが、それらのすべては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()は1回だけ呼ばれます。また、関数全体はtry-catchブロックで囲まれています。だから私は知りたいのですが、このエラーはどこから来ましたか?

役に立ちましたか?

解決

「テスト」を返す場合は、応答出力ストリームを使用してバイナリファイルを返すようにコントローラに送信するように指示しています。これがどのように管理するかという考えです:

Spring Controllerからのファイルのダウンロード

他のヒント

私はちょうどこの問題を経験しました。

問題は、 String(View Name)の返品タイプを試みると、終了時のコントローラメソッドが原因で発生しました。メソッドが終了すると、2番目の応答ストリームが開始されます。

コントローラ方式の変更リターンタイプ Void 問題を解決しました。

私は他の誰かがこの問題を経験した場合にこれが役立つことを願っています。

Stringを送信したい場合は、

を変更できます。
return "test";
.

return null;
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top