0

Spring mvc コントローラーを使用して動的に画像を生成しようとしています。

@Controller
@RequestMapping("/")
public String generateMik(final HttpServletResponse response){
...
BufferdImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
...

response.setContentType("image/png");
try {
    OutputStream os = response.getOutputStream();
    ImageIO.write(buffer, "png", os);
    os.flush();
    os.close();
...
}

そして、私はこの写真を .jsp で表示します:

<img src="picture" id="picture">

すべて正常に動作し、ブラウザに画像が表示されますが、例外が発生し、通常の理由でこの問題を解決する方法がわかりません (この例外をキャッチしたくありません)。

org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:626)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:215)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:190)
...

そして私の質問は、おそらく簡単な方法で動的画像を生成するにはどうすればよいですか? 写真を一時的に保存したくありません。たぶん、outputStream をモデル化し、jsp で何らかの魔法の方法で表示しますか?

4

3 に答える 3

3

これは、特定のビューにリクエストを転送するようにスプリングに要求するコントローラーメソッドに戻りパラメーターがあるためだと思います。

戻り値の型を void にする必要があります。

public void generateMik(final HttpServletResponse response)
于 2012-10-18T15:31:01.880 に答える
3

@RequestMapping画像をストリームに書き込んでいるメソッドにアノテーションを付けて、@ResponseBodySpring MVC に応答のレンダリングに使用するビューを見つけようとしないように指示する必要があります。@ResponseBody出力ストリームへの書き込みを自分で処理するメソッドで使用します。

@RequestMappingメソッドは を返すため、StringSpring はメソッドのレスポンス値を、レスポンスのレンダリングに使用するビューの名前として解釈します。

応答ストリームを書き込んで (そして閉じて)、Spring MVC がビュー クラスを呼び出して同じ応答ストリームに書き込もうとするため、例外が表示されます。

于 2012-10-18T16:06:51.797 に答える
1

これは私にとってはうまくいきます:

@RequestMapping(value = "/img", method = RequestMethod.GET)
public @ResponseBody void getImage(HttpServletResponse response)
{
    BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);

    response.setContentType("image/png");
    OutputStream out;
    try
    {
        out = response.getOutputStream();
        ImageIO.write(image, "png", out);
        out.close();
    }
    catch (IOException ex)
    {
        Logger.getLogger(IndexController.class.getName()).log(Level.SEVERE, null, ex);
    }
}

しかし、もっとスマートな方法があると 99.8% 確信しています。

于 2012-10-18T15:28:38.980 に答える