@ResponseBody导致EofException

时间:2013-10-09 17:49:48

标签: java spring spring-mvc

我有一个Spring MVC控制器,它通过@ResponseBody注释返回一段HTML(作为String)。以下是方法签名:

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

从嵌入式Jetty实例运行应用程序时,我得到了预期的HTML响应,但是,app server logs会为每个请求抛出以下堆栈跟踪:

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方法会导致过早的套接字关闭以及是否有任何方法可以克服这个问题。

1 个答案:

答案 0 :(得分:1)

我想出来了。我使用Maven Cargo插件(版本1.3.3)来运行我的嵌入式Jetty实例。 Cargo版本1.3.3使用嵌入式Jetty容器的版本候选版本(v 9.0.0-RC0)。

我尝试将Cargo插件升级到使用Jetty 9.0.5的版本1.4.4,并且EofException消失了。