5

@ResponseBody アノテーションを介して HTML のスニペットを (文字列として) 返す Spring MVC コントローラーがあります。メソッドのシグネチャを次に示します。

@RequestMapping(value="/weather", method=RequestMethod.GET, produces="text/html")
@ResponseBody
public String getWeatherForcast(HttpServletResponse response)

組み込みの Jetty インスタンスからアプリケーションを実行すると、予想される HTML 応答が得られますが、アプリケーション サーバー ログはすべての要求に対して次のスタック トレースをスローします。

org.eclipse.jetty.io.EofException
        at org.eclipse.jetty.server.HttpOutput.flush(HttpOutput.java:137)
        at ch.qos.logback.access.servlet.TeeServletOutputStream.flush(TeeServletOutputStream.java:85)
        at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:297)
        at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
        at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
        at org.springframework.util.StreamUtils.copy(StreamUtils.java:107)
        at org.springframework.http.converter.StringHttpMessageConverter.writeInternal(StringHttpMessageConverter.java:106)
        at org.springframework.http.converter.StringHttpMessageConverter.writeInternal(StringHttpMessageConverter.java:40)
        at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:179)
        at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:148) ...

Jetty コードを見ると、リクエストのソケット接続が閉じられているため、この例外がスローされています。

そうは言っても、代わりに Response オブジェクト (以下のスニペット) を直接操作すると、同じ結果が得られますが、EofException はありません。

@RequestMapping(value="/weather", method=RequestMethod.GET, produces="text/html")
public void getWeatherForcast(HttpServletResponse response) {     
     ....

response.getWriter().write(xpathTemplate.evaluateAsString("/rss/channel/item/description",result));
   response.flushBuffer();
}

Spring @ResponseBody アプローチが時期尚早のソケットのクローズを引き起こす理由と、とにかくこれを克服する方法があるかどうか疑問に思っています。

4

1 に答える 1

1

私はこれを理解しました。Maven Cargo プラグイン (バージョン 1.3.3) を使用して、組み込みの Jetty インスタンスを実行していました。組み込みの Jetty コンテナー (v 9.0.0-RC0) のリリース候補バージョンを使用する Cargo のバージョン 1.3.3。

Cargo プラグインを、Jetty 9.0.5 を使用するバージョン 1.4.4 にアップグレードしようとしましたが、EofException はなくなりました。

于 2013-10-10T16:34:14.507 に答える