org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported
1:先上控制臺報錯信息
?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 | org.springframework.web.HttpRequestMethodNotSupportedException: Request method ‘PUT‘ not supported at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java: 203 ) at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java: 352 ) at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java: 299 ) at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java: 57 ) at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java: 299 ) at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java: 1104 ) at org.springframework.test.web.servlet.TestDispatcherServlet.getHandler(TestDispatcherServlet.java: 90 ) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java: 916 ) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java: 877 ) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java: 966 ) at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java: 879 ) at javax.servlet.http.HttpServlet.service(HttpServlet.java: 647 ) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java: 842 ) at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java: 65 ) at javax.servlet.http.HttpServlet.service(HttpServlet.java: 725 ) at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java: 167 ) at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java: 134 ) at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java: 144 ) at main.test.PerformanceTestBase.testPut(PerformanceTestBase.java: 46 ) at main.test.PerformanceTest.junitTestUpdRentByQian(PerformanceTest.java: 1917 ) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 57 ) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43 ) at java.lang.reflect.Method.invoke(Method.java: 606 ) at org.junit.runners.model.FrameworkMethod$ 1 .runReflectiveCall(FrameworkMethod.java: 50 ) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java: 12 ) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java: 47 ) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java: 17 ) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java: 26 ) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java: 73 ) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java: 82 ) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java: 73 ) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java: 325 ) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java: 217 ) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java: 83 ) at org.junit.runners.ParentRunner$ 3 .run(ParentRunner.java: 290 ) at org.junit.runners.ParentRunner$ 1 .schedule(ParentRunner.java: 71 ) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java: 288 ) at org.junit.runners.ParentRunner.access$ 000 (ParentRunner.java: 58 ) at org.junit.runners.ParentRunner$ 2 .evaluate(ParentRunner.java: 268 ) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java: 61 ) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java: 68 ) at org.junit.runners.ParentRunner.run(ParentRunner.java: 363 ) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java: 163 ) at org.junit.runner.JUnitCore.run(JUnitCore.java: 137 ) at org.junit.runner.JUnitCore.run(JUnitCore.java: 115 ) at main.test.TestRunnable.run(PerformanceTest.java: 2129 ) at java.lang.Thread.run(Thread.java: 744 ) |
2:分析錯誤原因
以前分析過一些異常相關的問題,自從進入新公司之後,也做了若幹個項目,其中也遇到了許多的問題,不過每一個新的問題都記錄下來自己的分析、解決之道的習慣沒有保持下來,主要事情比較多,上班和住的地方相對比較遠,每天早出晚歸,精力時間有限。哈哈,不過這個問題遇到幾次了,前幾天同事又遇到了,讓我萌生了繼續記錄下來的想法。
還是老辦法,遇到程序報錯,先從頭到尾將報錯信息過一遍,分析、解決的思路無怪乎下面幾種:
1:如果是以前遇到過並且分析解決過的,那麽問題就迎刃而解了——這就是積累的重要性的體現了
2:如果從來沒遇到過,先將報錯信息從頭到尾掃一下,自己編寫的代碼出錯的概率是個大概率事件,找找報錯信息中自己項目中報錯的代碼是那一句,結合報錯信息和自己的代碼,大部分的錯誤都能找到根源,並且通過自己的分析都能解決掉,現在這個錯誤就是這樣的。
有用的報錯信息是:org.springframework.web.HttpRequestMethodNotSupportedException: Request method ‘PUT‘ not supported?
我的代碼中相關的代碼是:@RequestMapping(value="/BG/Rent/{id}",method={RequestMethod.POST}))
請求的方法有:
12345 | package org.springframework.web.bind.annotation; public enum RequestMethod { GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; } |
問題很明顯了,下面就是看看該修改那裏的問題了——我這裏是通過多線程+單元測試的方式模擬簡單的壓力測試情景,看一下自己單元測試中的情況,發現對應的方法調錯了,ok,發現問題基本上算是解決了問題。修改一下就好了,然後測試一下。
3:如果自己從來沒遇到過,通過步驟2也不能將問題解決,就需要自己利用搜索引擎的力量了,基本上到這裏又能解決大部分的問題了
3:題外話
目前的項目采用的是AngularJs+Bootstrap+SpringMVC+SpringBoot+JPA的技術手段來實施的,並且前後端的開發是分開的,通過使用AngularJs發送異步請求的方式常常會出現這個問題,因為同一個URL通過配置不同的方法的方式來對應應用中的增刪改查的方法(增——PUT,刪——DELETE,改——POST,查——POST/GET分別對應列表查詢和單個的信息查詢)。
4:查看對應的報錯異常類的相關信息,有時也能幫助我們更快更好更全面的了解此異常觸發的時機,比如:
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported