最初的问题是当我发送带有'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'请求时,正文仍然是空的。有没有人以前遇到过同样的问题?帮助赞赏!
答案 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);
}
}