如何解决“ org.springframework.web.HttpRequestMethodNotSupportedException:请求方法'POST'不被支持?”

时间:2019-01-02 11:42:55

标签: java spring spring-mvc web-applications

所以我收到警告

 WARN  [org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver] (default task-2) Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported] 

当我转到以下网址http://localhost:8080/ProjectFE/uregistration时  网站显示

  

不允许使用HTTP 405方法

这是我的控制器代码:

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import model.daoimpl.UserinfoDaoImpl;
import model.dao.IUserinfoDAO;
import model.entity.Userinfo;

@Controller
public class RegistrationController {
    @RequestMapping(value="/registration",method = RequestMethod.GET)
    public String addRegistrationPage() {
        return "registrationpage";
    }
    @RequestMapping(value="/uregistration",method = RequestMethod.POST)
    public String addURegistrationPage(@ModelAttribute("User")Userinfo u) {
        IUserinfoDAO iu = new UserinfoDaoImpl();
        boolean b = iu.insertInfo(u);
        if(b)
            return "success";
        else
            return "registrationpage";
    }

}

那我该怎么办?另外,如果需要其他任何代码,请评论我将编辑帖子, 谢谢。

4 个答案:

答案 0 :(得分:0)

问题出在代码内的注释@Controller上。将其更改为@RestController,它应该开始工作。 这是我创建的示例代码,效果很好:

package com.sample;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@RestController
public class Sample {
@RequestMapping(value="/registration",method = RequestMethod.GET)
public String addRegistrationPage() {
    return "registrationpage";
}
@RequestMapping(value="/uregistration",method = RequestMethod.POST)
public String addURegistrationPage(@RequestBody String u) {

    boolean b = true;
    if (b)
        return "success";
    else
        return "registra";
}

}

答案 1 :(得分:0)

由于您的GET处理程序映射为/registration,因此将您的POST处理程序映射更改为相同的值:

@RequestMapping(value = "/registration", method = RequestMethod.POST)

答案 2 :(得分:0)

我通过在向服务器发出Ajax请求时仅添加spring文档中提到的csrf配置来解决了我的问题。请记住,csrf在春季默认情况下处于启用状态,您必须禁用它(坏)或启用它。 链接在这里

  

https://docs.spring.io/spring-security/site/docs/5.0.x/reference/html/csrf.html

所以我添加了 <meta name="_csrf" th:content="${_csrf.token}" /> <meta name="_csrf_header" th:content="${_csrf.headerName}" />

<script type="application/x-javascript">
   (function () {
       var token = $("meta[name='_csrf']").attr("content");
       var header = $("meta[name='_csrf_header']").attr("content");
       $(document).ajaxSend(function(e, xhr, options) {
          xhr.setRequestHeader(header, token);
       });
   });
</script>

在我的html头和我提交的表单中,我包括了这个小的隐藏输入,并且我为我工作。希望对您有帮助。

<input type="hidden" th:name="${_csrf.parameterName}"
                        th:value="${_csrf.token}" />

答案 3 :(得分:0)

对于那些我们有相关问题的人,当我使用带有空格而不是 @RequestBody 的 @PathVariable 发帖时遇到了这个问题