2015-09-09 14 views
5

Jak metoda POST może nie być obsługiwana przez Spring Boot MVC?! Próbuję zaimplementować proste metody POST, który akceptuje listę podmiotów: tutaj jest mój kodMetoda Spring Boot 405 POST nie jest obsługiwana?

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

    @RequestMapping(value = "/add", method = RequestMethod.POST) 
     public void add(@RequestBody List<Tag> keywords) { 
      tagsService.add(keywords); 
     } 
} 

Uderzanie ten URL tak:

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

Zapytanie ciała:

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

Otrzymuję:

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

EDIT:

debugowanie Wiosna Web Zapytanie 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"); 
     } 
    } 

Tylko dwie metody supportedMethods{GET,HEAD}

+0

Aktualizacja kod TagsController również. –

+3

Rozważ przeniesienie do wersji 2.W tej chwili kod w twoim pytaniu jest poprawny, co sprawia, że ​​odpowiedź jest bez znaczenia. – approxiblue

+0

@RafalG. kod, o którym mowa, nie powinien być "naprawiony", łamie to pytanie. – eis

Odpowiedz

9

Masz błąd w definicji adnotacji RestController. Zgodnie z docs to:

@interface publicznego RestController {

/** * Wartość ta może wskazywać na sugestię logiczny składnik imienia, * być przekształcony w wiosennym fasoli w przypadku automatycznie wykryty komponent . * @asunąć sugerowaną nazwę komponentu, jeśli dowolna * @since 4.0.1 */wartość ciągu() domyślnie "";

}

co oznacza, że ​​wartość wprowadzonych informacji („/ BACKOFFICE/tags”) to nazwa nie sterowniku ścieżki pod którym jest ona dostępna.

Dodaj @RequestMapping("/backoffice/tags") na klasie kontrolera i usuń wartość z adnotacji @RestController.

EDYTOWANIE: W pełni działający przykład, według komentarza, który nie działa - spróbuj użyć tego kodu - i uruchom lokalnie z 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

OK, to jest jedna, ale nadal nie działa ... nawet po jej zmianie – Adelin

+0

Pozwól mi ją odtworzyć. Daj mi 5 minut. –

+0

@Adelin, zobacz pełną roboczą próbkę. –