使用 Spring MVC 在 tomcat 中的 PATCH 方法

Posted

技术标签:

【中文标题】使用 Spring MVC 在 tomcat 中的 PATCH 方法【英文标题】:PATCH method in tomcat with Spring MVC 【发布时间】:2013-12-20 16:15:36 【问题描述】:

我使用的是 spring 3.2.4,并且我读到 Spring MVC 3.2.X 明确支持 PATCH HTTP 方法:

https://jira.springsource.org/browse/SPR-7985

http://docs.spring.io/spring/docs/3.2.0.RC1/reference/html/new-in-3.2.html

但是,当我在 Tomcat (7.0.41) 中部署我的应用程序时,我在使用 PATCH 方法时系统性地收到 501 错误。

为什么这不起作用?有没有办法让它工作?我应该使用另一个容器而不是 Tomcat 吗?

编辑:

这是我的 web.xml:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

<welcome-file-list>
  <welcome-file>index.html</welcome-file>
</welcome-file-list>

<context-param>
  <param-name>contextClass</param-name>
  <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>

<filter>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

还有我的依赖:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-orm</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-commons</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-core</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-config</artifactId>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-web</artifactId>
  <scope>runtime</scope>
</dependency>

提前致谢,

杰罗姆

【问题讨论】:

你能展示你的依赖(jars)和servlet配置吗?无论tomcat(servlet)版本如何,spring的FrameworkServlet都支持PATCH方法。 【参考方案1】:

好的,我终于找到了解决方案: http://docs.spring.io/spring/docs/3.2.5.RELEASE/spring-framework-reference/htmlsingle/#mvc-ann-form-urlencoded-data

为了支持 HTTP PUT 和 PATCH 请求,spring-web 模块提供 过滤器HttpPutFormContentFilter,可以在里面配置 web.xml:

<filter>
   <filter-name>httpPutFormFilter</filter-name>
   <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>

<filter-mapping>
   <filter-name>httpPutFormFilter</filter-name>
   <servlet-name>dispatcherServlet</servlet-name>
</filter-mapping>

<servlet>
   <servlet-name>dispatcherServlet</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

【讨论】:

【参考方案2】:
  <dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-servlet-api</artifactId>
    <version>7.0.30</version>
    <scope>provided</scope>
</dependency>

添加tomcat-servlet-api版本升级即可解决问题。

【讨论】:

好的,非常感谢!我将对其进行测试,然后更新有关问题的状态。

以上是关于使用 Spring MVC 在 tomcat 中的 PATCH 方法的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC项目无法部署到tomcat中运行。

摆脱 Tomcat 中的 Spring 日志

使EL与嵌入的tomcat 7一起工作(使用spring MVC)

带有 Spring Boot 的 Spring MVC 不适用于 Eclipse 的 Tomcat 服务器

内存泄漏 - Tomcat、Spring MVC

Tomcat PermGen 上的 Spring MVC 空间不断增加