我使用 the guide 创建了一个简单的 Spring Boot REST 服务,并且在我发布到 http://localhost:8080/greeting
时出现以下错误
-"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'POST' not supported",
我没有找到任何关于如何解决错误的信息。我正在使用版本 1.3.2.RELEASE 并使用 mvn spring-boot:run
启动 Tomcat。
指南说默认情况下允许所有 HTTP 方法。那么为什么它会响应不支持 POST?
当我 POST 到这个 URL 时,如何让 Spring 调用 Controller 方法?
正如它在 Spring REST guide 中所说的那样,
@RequestMapping
maps all HTTP operations by default
但是,如果按照他们的建议,您添加了允许的 http 方法的规范:
@RequestMapping(method=GET)
那么只允许 GET。 POST 将被禁止。
如果您想同时允许 GET 和 POST,但不允许所有其他 http methods ,然后这样注释您的 Controller 方法:
@RequestMapping(value = "/greeting", method = {RequestMethod.GET, RequestMethod.POST})
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
当您启动应用程序时,所有请求处理程序映射都会被注销。您应该会在日志中看到这样一行(在 IDE 控制台或命令行窗口中):
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/greeting],methods=[GET || POST]}" onto public hello.Greeting hello.GreetingController.greeting(java.lang.String)
此外,您是如何发帖的?我可以为 Google Chrome 推荐 Advanced REST client。如果您通过浏览器中的表单发帖,请尝试按 f12 并检查“网络”选项卡以检查您发帖的内容是否与您认为的内容完全一致。
发布到错误的 URL,例如http://localhost:8080/greetings
而不是 http://localhost:8080/greeting
将导致 Method Not Allowed 错误,尽管实际上错误是 URL 中的拼写错误,而不是 HTTP 方法的选择。
要查看请求处理的更详细日志记录,请在 src/main/java 文件夹旁边创建一个 src/main/resources 文件夹,并创建一个 application.properties 文件在那里。将此行添加到该文件
logging.level.org.springframework.web=DEBUG
然后,如果您尝试 POST 到一个未映射的 URL,例如/greetings
而不是 /greeting
,您将在日志中看到这些行:
RequestMappingHandlerMapping : Looking up handler method for path /greetings
RequestMappingHandlerMapping : Did not find handler method for [/greetings]