Spring Boot 405 POST方法不受支持?

怎样POST方法不支持Spring Boot MVC? 我正在尝试实现一个接受实体列表的简单post方法:这是我的代码

@RestController(value="/backoffice/tags") public class TagsController { @RequestMapping(value = "/add", method = RequestMethod.POST) public void add(@RequestBody List keywords) { tagsService.add(keywords); } } 

点击此URL如下:

 http://localhost:8090/backoffice/tags/add 

申请机构:

 [{"tagName":"qweqwe"},{"tagName":"zxczxczx"}] 

我收到:

 { "timestamp": 1441800482010, "status": 405, "error": "Method Not Allowed", "exception": "org.springframework.web.HttpRequestMethodNotSupportedException", "message": "Request method 'POST' not supported", "path": "/backoffice/tags/add" } 

编辑

调试Spring Web Request Handler

  public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.checkRequest(request); protected final void checkRequest(HttpServletRequest request) throws ServletException { String method = request.getMethod(); if(this.supportedMethods != null && !this.supportedMethods.contains(method)) { throw new HttpRequestMethodNotSupportedException(method, StringUtils.toStringArray(this.supportedMethods)); } else if(this.requireSession && request.getSession(false) == null) { throw new HttpSessionRequiredException("Pre-existing session required but none found"); } } 

supportedMethods中只有两个方法是{GET,HEAD}

您在RestController注释定义中有错误。 根据文档,它是:

public @interface RestController {

/ ** *该值可能表示逻辑组件名称的建议,*在自动检测组件的情况下将变为Spring bean。 * @return建议的组件名称,如果有* @since 4.0.1 * / String value()默认为“”;

}

这意味着您输入的值(“/ backoffice / tags”)是控制器的NAME,而不是它可用的路径。

在控制器的类上添加@RequestMapping("/backoffice/tags")并从@RestController注释中删除值。

编辑:完整的工作示例,根据评论,它不起作用 – 请尝试使用此代码 – 并从IDE本地运行。

的build.gradle

 buildscript { ext { springBootVersion = '1.2.5.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath("io.spring.gradle:dependency-management-plugin:0.5.2.RELEASE") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'spring-boot' apply plugin: 'io.spring.dependency-management' jar { baseName = 'demo' version = '0.0.1-SNAPSHOT' } sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile("org.springframework.boot:spring-boot-starter-web") testCompile("org.springframework.boot:spring-boot-starter-test") } eclipse { classpath { containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER') containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8' } } task wrapper(type: Wrapper) { gradleVersion = '2.3' } 

Tag.java

 package demo; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; public class Tag { private final String tagName; @JsonCreator public Tag(@JsonProperty("tagName") String tagName) { this.tagName = tagName; } public String getTagName() { return tagName; } @Override public String toString() { final StringBuilder sb = new StringBuilder("Tag{"); sb.append("tagName='").append(tagName).append('\''); sb.append('}'); return sb.toString(); } } 

SampleController.java

 package demo; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("/backoffice/tags") public class SampleController { @RequestMapping(value = "/add", method = RequestMethod.POST) public void add(@RequestBody List tags) { System.out.println(tags); } } 

DemoApplication.java

 package demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }