获取“405 - 调用”method = DELETE时不支持请求方法'GET'

时间:2012-07-13 13:37:23

标签: java http servlets spring-mvc

我有一个Spring MVC网络应用程序。在其中一个带有按钮的表单,该按钮应该从另一个资源中删除资源:

<td>
    <form action="/product-bases/${productBase.id}/positions/${position.id}" method="DELETE">
        <input type="submit" value="delete" />
    </form>
</td>

我的控制器:

@Controller
@RequestMapping(value = "/product-bases/{id}/positions")
public class ProductBasePositionController {

    @RequestMapping(value = "/{positionId}", method = RequestMethod.DELETE)
    public ModelAndView delete(@PathVariable Integer productBaseId, @PathVariable Integer positionId) {

所以理论上服务器应该路由到控制器。但唉它没有,因此是帖子;)

我正在

HTTP Status 405 - Request method 'GET' not supported

type Status report

message Request method 'GET' not supported

description The specified HTTP method is not allowed for the requested resource (Request method 'GET' not supported).
Apache Tomcat/7.0.19

显然我还没有定义get / / position / id,但为什么我应该暂时删除..

(我也试图在我的spring-test-mvc框架上运行一个模拟servlet,而没有任何tomcat实现,它给了我一个400 - 不好的请求.. )

那我在这里错过了什么?

哦,只是为了削减一些角落:post和get将适用于其他资源,所以其余的设置都没问题。

启动服务器甚至告诉我:

RequestMappingHandlerMapping [INFO] Mapped "{[/product-bases/{id}/positions/{positionId}],methods=[DELETE],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView our.view.controller.ProductBasePositionController.delete(java.lang.Integer,java.lang.Integer)

任何像我一样困惑的人?如果不那么,请赐教!

4 个答案:

答案 0 :(得分:6)

表单只能通过GETPOST提交(也许PUT,但我怀疑这是否已广泛实施),因为表单提交需要一种方法,将数据传输到服务器

DELETE方法没有请求正文,因此不支持在表单操作中指定它。

答案 1 :(得分:2)

您的web.xml中是否有HiddenHttpMethodFilter过滤器?

<filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/view.html#rest-method-conversion

答案 2 :(得分:1)

错误消息表明浏览器实际发送GET请求而不是DELETE请求。

您需要做的是:

  • 检查当时浏览器所在网页的来源,

  • 使用浏览器的Web调试器,查看请求的URL和方法实际上是什么。

答案 3 :(得分:0)

在Microsoft Azure门户中,当我打开身份验证/授权时,我收到了Java App的错误。如果您遇到同样的问题,请恢复您的操作。