Spring boot - 嵌入式Tomcat - Connector Customizer - 无法添加parseBodyMethods属性

时间:2017-10-22 08:57:46

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

最初的问题是当我发送带有'DELETE'方法的http请求时,无法将正文部分发送到服务器。

在谷歌搜索之后,我发现this article建议修改server.xml文件并将“parseBodyMethods”添加到Connector部分可以解决问题:

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

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

    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;
}

但是,同样的问题仍然存在。当我向服务器发送'DELETE'请求时,正文仍然是空的。有没有人以前遇到过同样的问题?帮助赞赏!

2 个答案:

答案 0 :(得分: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");
        }
    };
}

答案 1 :(得分:0)

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

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

引用该文章(code是我的重点):

  

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

因此,要解决您的问题,您需要从软件包WebServerFactoryCustomizer实现接口org.springframework.boot.web.server,并用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);
  }
}