2015-09-09 285 views
5

怎么可能POST方法不被Spring Boot MVC支持?我想实现一个接受实体列表一个简单的POST方法:这里是我的代码Spring Boot 405不支持POST方法?

@RestController(value="/backoffice/tags") 
public class TagsController { 

    @RequestMapping(value = "/add", method = RequestMethod.POST) 
     public void add(@RequestBody List<Tag> 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请求处理程序

 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}

+0

更新TagsController的代码。 –

+3

考虑回滚到修订2。现在,你的问题中的代码是正确的,使答案毫无意义。 – approxiblue

+0

@RafalG。有关的代码不应该是“固定的”,它打破了这个问题。 – eis

回答

9

你有RestController注释定义错误。根据该文档,它是:

公共@interface RestController {

/** *可以指示用于一个逻辑组件 名称的建议值,*要变成一个Spring bean中的情况下自动检测 组件。 * @返回建议的组件名称,如果有的话* @since 4.0.1 */String value()default“”;

}

这意味着你已经输入(“/后勤/标签”)的值是控制器不是可在其下的路径名。

在控制器的类别上添加@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); 
    } 
} 
+0

好吧,这是一个,但它仍然无法正常工作...即使改变它 – Adelin

+0

让我重现它。给我5分钟。 –

+0

@Adelin请参阅完整的工作示例。 –

相关问题