2013-07-03 13 views
6

Ich habe eine Spring 3.2-Anwendung und ich habe eine REST-API nach this Beispiel basierend auf Spring MVC erstellt. Jetzt habe ich einige Probleme beim Versuch, einige Daten für verschiedene HTTP-Methoden zu validieren (z. B .: POST- und PUT-Methoden).Spring Rest API-Validierung

Dies wäre ein ziemlich vereinfachtes Beispiel sein:

public class myItem{ 

    @NotEmpty 
    private String foo; 

    @NotEmpty 
    private String bar; 

    public myItem(String foo){ 
     this.foo = foo; 
     this.bar = ""; 
    } 

    public myItem(String foo, String bar){ 
     this.foo = foo; 
     this.bar = bar; 
    } 

    /* getters & setters omitted */ 

} 

Diese POJO in den verschiedenen Anforderungsmethoden wiederverwendet werden.

Das wäre meine vereinfachte Steuerung sein:

@Controller 
@RequestMapping("/api/item") 
public class myItemController{ 

    @RequestMapping(value="/", method=RequestMethod.POST) 
    @ResponseStatus(HttpStatus.CREATED) 
    public @ResponseBody myItem createItem(@Valid @RequestBody myItem item){ 
     /* do some stuff */ 
     return item; //inserted item returned 
    } 

    @RequestMapping(value="/", method=RequestMethod.PUT) 
    @ResponseStatus(HttpStatus.NO_CONTENT) 
    public @ResponseBody myItem createItem(@Valid @RequestBody myItem item){ 
     /* do some stuff */ 
     return item //updated item returned 
    } 
} 

In der POST-Methode ich nur foo Feld gesetzt werden, so dass diese Anforderung fehlschlagen würde mit dem vor über Anmerkungen erwarten. In der PUT-Methode erwarte ich, dass sowohl foo als auch bar Felder gesetzt werden, so dass diese Anfrage erfolgreich abgeschlossen werden würde.

Was ist der richtige Ansatz, um mit solchen Situationen umzugehen: Bei einer bestimmten Anfrage-Methode erwarten Sie nicht, dass alle Felder ausgefüllt werden (einige Felder können Standardwerte haben, daher möchten Sie nicht alle prüfen) sie, aka create), und in einer anderen Methode müssen Sie alle Felder (aka update) überprüfen.

Antwort

9

Verwenden Validierung Gruppen:

public interface ValidateOnCreate {} 
public interface ValidateOnUpdate {} 

.

public class myItem{ 
    @NotEmpty(groups = { ValidateOnCreate.class, ValidateOnUpdate.class }) 
    private String foo; 

    @NotEmpty(groups = ValidateOnUpdate.class) 
    private String bar; 
    ... 
} 

.

@RequestMapping(value="/", method=RequestMethod.POST) 
@ResponseStatus(HttpStatus.CREATED) 
public @ResponseBody myItem createItem(
    @Validated(ValidateOnCreate.class) @RequestBody myItem item) { ... } 

@RequestMapping(value="/", method=RequestMethod.PUT) 
@ResponseStatus(HttpStatus.NO_CONTENT) 
public @ResponseBody myItem createItem(
    @Validated(ValidateOnUpdate.class) @RequestBody myItem item) { ... } 

Beachten Sie, dass Frühling spezifische @Validated in diesem Fall brauchen, weil @Valid nicht zulässt, dass Sie Gruppen angeben.

Siehe auch:

+0

Dies ist die perfekte Antwort. Es war ein guter Tag, als sie implementiert https://jira.springsource.org/browse/SPR-6373 – digitaljoel

+0

so viel übrig zu lernen ... Viel geschätzt, danke! – jarandaf

Verwandte Themen