【问题标题】:@ResponseBody results in EofException@ResponseBody 导致 EofException
【发布时间】:2013-10-11 00:34:14
【问题描述】:

我有一个 Spring MVC 控制器,它通过 @ResponseBody 注释返回 HTML 的 sn-p(作为字符串)。下面看一下方法签名:

@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 对象(下面的 sn-p)我会得到相同的结果,但没有 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 方法会导致套接字过早关闭,以及是否有办法克服这个问题。

【问题讨论】:

  • 您使用的是哪个jetty 版本?

标签: java spring spring-mvc


【解决方案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 消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多