2017-10-31 4 views
0

Ich habe die folgende Controller (nach Rails Namenskonvention)Spring MVC Routen falsche Aktion

@RestController("/vehicles") 
public class VehiclesController { 

    @GetMapping 
    public Iterable<Vehicle> index(
     @RequestParam(defaultValue = "1") int page, 
     @RequestParam(defaultValue = "25") int per 
    ) { 
     ... 
    } 

    @GetMapping("/{id}") 
    public Vehicle show(@PathVariable long id) { 
     ... 
    } 

    @PostMapping 
    public Vehicle create(@RequestBody Vehicle vehicle) { 
     ... 
    } 

    @PatchMapping("/{id}") 
    public void update(@PathVariable long id, @RequestBody Vehicle params) { 
     ... 
    } 

    @DeleteMapping("/{id}") 
    public void destroy(@PathVariable long id) { 
     ... 
    } 

} 

Jedes Mal, wenn ich die Anfrage senden

GET /vehicles 

Ich erwarte, dass die Anforderung an die index Verfahren geleitet wird , aber es wird tatsächlich an die show-Methode weitergeleitet, die dann fehlgeschlagen ist, um den Inhalt zu liefern, da das Framework "vehicles" nicht in long konvertieren kann. Hier ist die Fehlermeldung:

Failed to bind request element: org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'long'; nested exception is java.lang.NumberFormatException: For input string: "vehicles" 

Gibt es etwas falsch in meinem Code? Danke im Voraus.

Antwort

0

Die value-Eigenschaft der @RestController Annotation ist kein Pfadpräfix, sondern ein Bean-Name. Um allen annotierten Methoden in Ihrem Controller ein Präfix zu geben, notieren Sie die Controller-Klasse mit @RequestMapping("/vehicles").

@RestController 
@RequestMapping("/vehicles") 
public class VehiclesController { 

    @GetMapping 
    public Iterable<Vehicle> index(
     @RequestParam(defaultValue = "1") int page, 
     @RequestParam(defaultValue = "25") int per 
    ) { 
     ... 
    } 

    ... 
} 
+0

Danke. Aber ich frage mich, warum man eine benannte Controller-Instanz braucht. –

+0

Alle Controller werden trotzdem benannt (Klassenname beginnt mit Kleinbuchstaben). Es ist nur eine Konvention, die für alle ähnlichen Annotationen wie '@ Service',' @ Component' verwendet wird. Möglicherweise möchten Sie den Namen ändern, wenn eine Bean mit demselben Namen bereits registriert ist, z. B. durch Abhängigkeit von Drittanbietern. Ich hatte so einen Fall mit Spring Social, aber vor langer Zeit kann ich mich nicht an Details erinnern. –

0

Dies ist nicht korrekt.

@RestController("/vehicles") 

Der Wert ("/ Fahrzeuge") ist der Name der Komponente

Um einen REST-Pfad @RestController Anmerkung hinzufügen müssen und @RequestMapping Anmerkungen auf der Klasse.

@RestController() 
@RequestMapping(value = "/vehicles") 

Der Wert /Fahrzeuge ist das Suffix Ihrer HTTP-Aufruf.

Sie müssen auch die Anmerkung auf Ihrem Index Methode ändern:

@RequestMapping(value = "", method = RequestMethod.GET) 
public Iterable<Vehicle> index(
    @RequestParam(defaultValue = "1") int page, 
    @RequestParam(defaultValue = "25") int per 
) 

und alles sollte wie erwartet funktionieren.

+0

'value' Eigenschaft' @ RestController' ist kein Weg. Es ist ein Komponentenname: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RestController.html#value-- –

+0

Danke, ich habe die Antwort aktualisiert . – db80