Spring Boot 1.4.0:REST控制器没有为HTTP响应设置原因

时间:2016-09-09 14:20:49

标签: java spring spring-mvc spring-boot

我有两个使用Spring Tool Suite创建的项目" Spring Starter Project":

第一个项目: Spring Boot 1.3.7(发布)+ Web

第二个项目: Spring Boot 1.4.0(发布)+ Web

我用这段代码替换每个项目的@SpringBootApplication类:

@SpringBootApplication
@RestController
public class TestWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestWebApplication.class, args);
    }

    @RequestMapping("/hello")
    public String sayHello() {
        return "hello!";
    }
}

当我在每台服务器上调用GET /hello时,我得到以下回复:

第一个项目(1.3.7):状态200 (无理由)

第二个项目(1.4.0):状态200确定

这是一个错误还是我错过了什么?

此外,我无法为1.4.0项目设定理由。

3 个答案:

答案 0 :(得分:3)

行为的改变是由使用Tomcat 8.0的Spring Boot 1.4和使用Tomcat 8.0的Spring Boot 1.3引起的。 Tomcat 8.5没有发送原因短语。

严格来说,短语不是必需的。在RFC 7230中,原因短语定义为:

reason-phrase  = *( HTAB / SP / VCHAR / ons-text )

*表示零或更多。换句话说,因为短语是空的,它是合法的。

Tomcat 8.5利用了这一点,并通过删除原因短语来节省一些带宽。如果这对您的客户造成问题,那么它可能没有规范,因为RFC已经链接到上面的RFC的这些说法:

  

原因 - 短语元素的存在仅仅是为了提供与数字状态代码相关联的文本描述,主要是出于对先前的Internet应用程序协议的尊重。   更常用于交互式文本客户端。客户应该   忽略原因 - 短语内容。

如果缺少原因短语导致问题,你还没有说过。如果不是,那么您最好的行动方案就是不要担心并继续前进。如果您真的想出于某种原因保留原因短语,那么切换到Undertow或Jetty是您最好的选择。

答案 1 :(得分:1)

我用假装提出了一个错误,几乎立即修复了.. 请检查https://github.com/OpenFeign/feign/issues/382

谢谢, KK

答案 2 :(得分:0)

最初,原因短语已由 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.x 中(即:不会发送响应消息)

参考: