2016-07-20 17 views
1

Im Folgenden meine Anwendungscodeändern @RequestBody Objekt basierend auf @PathVariable

@RequestMapping(value = "app/{version}/register", method = RequestMethod.POST, consumes = "application/json") 
@ResponseBody 
public RegisterMemberResponse registerMember(@Valid @RequestBody RegisterMemberRequest request,@PathVariable Integer version){ 
    return registerservice.register(request); 
} 

für App-Version 1 meiner RegisterMemberRequest Klasse ist

public class RegisterMemberRequest{ 
    @NotNull 
    private String firstName; 
    @NotNull 
    private String lastName; 

    //gatter & setter... 
} 

und für App-Version 2 meiner Anfrage Klasse ist

public class LatestRegisterMemberRequest extends RegisterMemberRequest{ 
    @NotNull 
    private String middleName; 
    //getter & setter... 
} 

also wie kann ich meine registerMember() Methode so ändern, dass ich sowohl Version 1dienen kann2 Anfrage URI.

Antwort

0

Wenn Sie die Versionsnummer in die URL fest codieren möchten (was ich nicht empfehlen würde), könnten Sie einfach zwei verschiedene Controller-Methoden mit fest codierten Pfaden wie app/v1/register und app/v2/register verwenden.

Ein anderer Weg wäre, die Inhaltsverhandlung zu verwenden und die Anfragen entsprechend einem gegebenen Inhaltstyp, z. application/vnd+<YOURCOMPANY>.<DATATYPE_AND_VERSION>+json, auch unter Verwendung separater Rest-Controller-Methoden, die mit @Consumes annotiert sind.

+0

Also nach Ihrem ersten Absatz, wenn ich 10 Version der Anwendung habe ich 10 Methode schreiben und alles enthält 80-90% gleichen Code. Ich wollte nicht im zweiten Absatz sagen. – RBS

+0

Natürlich stellen Sie einige weitere Methoden vor, aber Sie stellen auch mehr Ruheschnittstellen zur Verfügung. Wenn Sie eine gemeinsame Logik haben, können Sie das allgemeine Zeug leicht in eine eigene Methode extrahieren oder wahrscheinlich sogar 'registerV1()' von 'registerV2()' aufrufen. Wenn Sie einige Rest-Interfaces für die Öffentlichkeit bereitstellen, sollten Sie besser nicht zehn verschiedene Versionen derselben Schnittstelle unterstützen, da es dann sehr schwierig sein wird, Ihre API zu verwenden. –

+0

Der zweite Abschnitt behandelt eine andere Option, die verschiedene Methoden bereitstellt, die jedoch auf dem Inhaltstyp-Header anstelle einer URL basieren. Ihre URL ist also immer 'app/register', wird aber mit verschiedenen Header-Werten' application/vnd + ABC.register-v1 + json' und 'application/vnd + ABC.register-v2 + json' aufgerufen. Aber alles in allem ist der bevorzugte Weg, robustere und rückwärtskompatible Apis zu bauen und daher nicht alle auto-magischen Validierungs-Sachen zu verwenden. Siehe https://en.wikipedia.org/wiki/Robustness_principle –

0

Ich denke, Sie können Requestmapping-uri-templates-regex verwenden, Versionsnummer wird die @PathVariable schreiben Sie Ihre Geschäftslogik, um zu entscheiden, was der Antwortkörper sein sollte, hängt von der Version der pathvariable ab.

+0

Hallo Lovababu, Ich glaube, Sie haben keine tatsächliche Frage erhalten, es ist nicht über Anfrage Zuordnung mit Pfadvariable es über Änderung des Anfrageobjekts nach Pfad Variable Wert. – RBS

Verwandte Themen