Spring Boot MVC如何不支持POST方法?我正在尝试实现一个简单的post方法,该方法接受实体列表:这是我的代码
@RestController(value="/backoffice/tags") public class TagsController { @RequestMapping(value = "/add", method = RequestMethod.POST) public void add(@RequestBody List<Tag> keywords) { tagsService.add(keywords); } }
像这样点击此网址:
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请求处理程序
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}
supportedMethods
{GET,HEAD}
RestController注释定义中存在错误。根据文档,它是:
公共@interface RestController { / 该值可能表明建议使用逻辑组件名称,如果自动检测到组件,则将其转换为Spring bean。 @返回建议的组件名称(如果有的话) @自4.0.1开始* /字符串value()默认为“”; }
公共@interface RestController {
/ 该值可能表明建议使用逻辑组件名称,如果自动检测到组件,则将其转换为Spring bean。 @返回建议的组件名称(如果有的话) @自4.0.1开始* /字符串value()默认为“”;
}
这意味着您输入的值(“ / backoffice / tags”)是控制器的名称,而不是其可用路径。
添加@RequestMapping("/backoffice/tags")控制器的类,并从@RestController注释中删除值。
@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<Tag> 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); } }