spring boot 405 post方法,但get方法有效

xvw2m8pv  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(368)

我使用springboot和springmvc来做一个简单的crud用户注册html5表单,其中有许多字段要使用post-submit方法发布。我有一个rest控制器,它使用@controller和@responsebody,它通过一个用户服务调用方法来处理get,post调用,使用spring的jpa存储库调用存储库。一旦用户输入一个新的用户记录并点击提交按钮,控制器将保存该记录并使用spring的模型和视图传输到listallusers.html视图(其中包含一个显示所有保存的用户的网格)。
当我在提交表单和控制器方法中都使用get和post方法作为操作方法时,用户记录被成功保存,但是在那之后,get方法成功地将我的视图定向到listallusers.html,但是post方法没有。当我使用post方法时,我得到一个“spring boot 405 post method not supported”,并且我没有被控制器引导到视图listallusers.html。如何使用post方法重定向到视图listallusers.html?我在下面复制我的代码。
registernewuser.html:

<div class="card" style="">
  <div class="container" style="padding:30px;">
    <span style="font-size:20pt;">用户注册</span><br/><br/>
    <form id= "add_user" name="add_user" method="POST" action="/addUser">
    <div class="card-body">
    <table style="border-collapse: separate; border-spacing: 10px;" cellpadding="10" cellspacing="10" width="50%">
    <tr><td>昵称</td><td><input type="text" id="txtUserName" name="txtUserName" style="" size="20" placeholder="单行输入"></td></tr>
    <tr><td>电话号码</td><td><input type="text" id="txtTelNo" name="txtTelNo" style="" size="20" placeholder="单行输入"></td></tr>
    <tr><td>密码</td><td><input type="password" id="txtPassword" name="txtPassword" style="" size="20" placeholder=""></td></tr>
    <tr><td>邮箱</td><td><input type="text" id="txtEmail" name="txtEmail" style="" size="20" placeholder="单行输入"></td></tr>
    <tr><td colspan="2" style="height:20px;"></td></tr>
    <tr><td colspan="2"><input type="submit" style="width:60%;text-align:center;" value="注册"></td></tr>
    </table>
    </div>
    </form>

  </div>
</div>

usercontroller.java:

@Controller
public class UserController {

    @Autowired
    UserService service;

/*@PostMapping(
            value = "/addUser",
            consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE, MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE},
            produces = {MediaType.APPLICATION_FORM_URLENCODED_VALUE, MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
    */
    @RequestMapping(value = "/addUser", method = RequestMethod.POST)
    public ModelAndView addUser(HttpServletRequest request, @RequestParam("txtUserName") String usrName, @RequestParam("txtTelNo") String telNo, @RequestParam("txtPassword") String password, @RequestParam("txtEmail") String email,
    HttpSession session) {

        User savedUser = new User();

        savedUser.setUserName(usrName);
        savedUser.setUserTelNo(telNo);
        savedUser.setUserPassword(password);
        savedUser.setUserEmail(email);
        savedUser.setUserRole("开发 人员");

        service.addNewUser(savedUser);

        ModelAndView mav = new ModelAndView("listUsers");

        return mav;
    }    
}

我在控制台中收到以下错误消息:

2021-01-24 23:51:12.604[0;39m [33m WARN[0;39m [35m17700[0;39m [2m---[0;39m [2m[nio-8080-exec-7][0;39m [36m.w.s.m.s.DefaultHandlerExceptionResolver[0;39m [2m:[0;39m Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]

此错误消息显示在白色页面上:

There was an unexpected error (type=Method Not Allowed, status=405).
Request method 'POST' not supported
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
    at org.springframework.web.servlet.support.WebContentGenerator.checkRequest(WebContentGenerator.java:381)
    at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:536)
    at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:53)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:171)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1393)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1138)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1077)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:832)
jdg4fx2g

jdg4fx2g1#

您混淆了@requestbody和@requestparam。控制器方法需要requestbody对象,而不是字符串参数。

o0lyfsai

o0lyfsai2#

我终于可以用post方法了。我只是在控制器的返回参数中添加了一个“redirect:”,以重定向到所需的视图,当然还更改了调用窗体和控制器的post方法。下面是我修改过的代码:

//login
    @RequestMapping(value= "/login", method= RequestMethod.POST)
    public String login(@RequestParam("txtUserName") String usrName, @RequestParam("txtPassword") String password) {

        System.out.println("LOGIN UserName : " + usrName + " Password : " + password);

        //Process the admin password - hardcoded
        if(usrName.equals("admin") && password.equals("admin123")) 

            { return "redirect:main.html"; }

        else 

            { return "redirect:invalid_login.html"; }

    }

相关问题