Spring没有在响应

时间:2017-02-02 20:49:47

标签: java spring-mvc spring-boot

我正在使用一些第三方的东西,要求设置响应中的statusText。无论我做什么,都只是""。我正在使用 Spring 4.3.4和 Spring Boot 1.4.2。

我尝试在控制器方法中将HttpServletResponse作为参数,然后像这样调用sendError

public void foo(@PathVariable String myVar, HttpServletResponse response) throws IOException
{
  //... other stuff
  response.sendError(200, "OKOKOKOKOK");
}

但是,当实际响应返回浏览器时,响应如下所示:

{"timestamp":1486068130749,"status":200,"error":"OK","message":"OKOKOKOKOK","path":"/my/path"}

状态文本仍为""。我知道Spring必须在发送回客户端之前生成此响应。我怎么能阻止这个?有没有什么方法可以为statusText设置非空字符串?

2 个答案:

答案 0 :(得分:1)

我认为您必须引用Servlet容器发送的HTTP状态行。 从Tomcat 8.5开始,HTTP原因短语不再被写入,因为它不是必需的,HTTP客户端不应该读取:请参阅this Spring Boot issue for more details

答案 1 :(得分:1)

1.4.2 版本的Spring-boot使用了嵌入式tomcat 8.5.6 ,其中删除了响应文本。因此,您得到的statusText为“”。

最初,原因短语已由 Tomcat-8.5 删除。
但是,后来提供了一个修补程序,以使用 Http连接器中的属性对其进行配置。

您所要做的只是设置sendReasonPhrase="true"属性,它将像以前一样工作。


使用以下任何一种方法进行配置:

方法1:更新 ... / apache-tomcat-8.5.x / conf / server.xml 以包括以下属性:

<Connector port="8081" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" sendReasonPhrase="true" />

方法2:通过bean配置。 (添加到配置文件中)

@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
    factory.addConnectorCustomizers(connector ->
            ((AbstractProtocol) connector.getProtocolHandler()).setSendReasonPhrase(true));
    return factory;
}

注意::此配置将被放置在 Tomcat-9.0 中(即:不会发送响应消息)

参考: