【问题标题】:Spring boot - Embedded Tomcat - Connector Customizer - fail to add parseBodyMethods attributesSpring boot - Embedded Tomcat - Connector Customizer - 无法添加 parseBodyMethods 属性
【发布时间】:2018-04-02 23:46:57
【问题描述】:

最初的问题是当我使用“DELETE”方法发送一个 http 请求时,正文部分无法发送到服务器。

google了一下,发现this article建议修改server.xml文件,在Connector部分加入'parseBodyMethods'即可解决问题:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           parseBodyMethods="POST,PUT,DELETE"
           redirectPort="8443" />

但是,因为我使用的是 spring 的嵌入式 tomcat,所以我必须找到一种方法来以 spring 的方式做同样的事情。所以,我发现this article 似乎允许我添加 ConnectorCustomizer 并向连接器添加附加属性。以下是我的代码:

    public class MyTomcatConnectorCustomizer implements EmbeddedServletContainerCustomizer {

    @Override
    public void customize(ConfigurableEmbeddedServletContainer factory) {
        if(factory instanceof TomcatEmbeddedServletContainerFactory) {
            customizeTomcat((TomcatEmbeddedServletContainerFactory) factory);
        }
    }

    public void customizeTomcat(TomcatEmbeddedServletContainerFactory factory) {
        TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) factory;
        tomcat.addConnectorCustomizers(connector -> {
            connector.setAttribute("parseBodyMethods", "POST,PUT,DELETE");
        });
    }

}

@Bean
MyTomcatConnectorCustomizer myTomcatConnectorCustomizer() {
    MyTomcatConnectorCustomizer myTomcatConnectorCustomizer = new MyTomcatConnectorCustomizer();
    return myTomcatConnectorCustomizer;
}

但是,同样的问题仍然存在。当我向服务器发送“删除”请求时,正文仍然是空的。有没有人遇到过同样的问题?感谢您的帮助!

【问题讨论】:

    标签: spring rest tomcat embedded-tomcat-7 embedded-tomcat-8


    【解决方案1】:

    改变

    connector.setAttribute("parseBodyMethods", "POST,PUT,DELETE");
    

    connector.setParseBodyMethods("POST,PUT,DELETE")
    

    或者只是

    @Bean
    public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
        return new TomcatEmbeddedServletContainerFactory(){
            @Override
            protected void customizeConnector(Connector connector) {
                super.customizeConnector(connector);
                connector.setParseBodyMethods("POST,PUT,DELETE");
            }
        };
    }
    

    【讨论】:

      【解决方案2】:

      是的,我知道这是一个有点老的问题,但我偶然发现了这个问题,发现 SO 没有针对 Spring Boot 2.0.0 及更高版本的解决方案。

      我在 Baeldung 上找到了 this 文章,其中描述了 SB 2 与 SB 1 的变化。

      引用文章(code强调是我的):

      在 Spring Boot 2 中,EmbeddedServletContainerCustomizer 接口被替换为WebServerFactoryCustomizer,而ConfigurableEmbeddedServletContainer 类被替换为ConfigurableServletWebServerFactory

      因此,要解决您的问题,您需要从包 org.springframework.boot.web.server 实现接口 WebServerFactoryCustomizer 并使用 TomcatServletWebServerFactory 对其进行参数化,并覆盖它的 customize 方法。

      import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
      import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
      import org.springframework.boot.web.server.WebServerFactoryCustomizer;
      import org.springframework.stereotype.Component;
      
      @Component
      public class MyTomcatConnectorCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
      
        @Override
        public void customize(TomcatServletWebServerFactory factory) {
          TomcatConnectorCustomizer parseBodyMethodCustomizer = connector -> {
            connector.setParseBodyMethods("POST,PUT,DELETE");
          };
          factory.addConnectorCustomizers(parseBodyMethodCustomizer);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-25
        • 2017-11-06
        • 1970-01-01
        • 2017-06-28
        • 2018-05-12
        • 2015-10-14
        • 2017-10-11
        • 2018-12-20
        相关资源
        最近更新 更多