2013-07-03 34 views
6

Ho un'applicazione Spring 3.2 e ho creato un'API REST seguendo l'esempio this basato su Spring MVC. Ora sto riscontrando alcuni problemi durante il tentativo di convalidare alcuni dati per diversi metodi http (ad es .: metodi POST e PUT).Convalida API Spring Rest

Questo sarebbe un esempio piuttosto semplificato:

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 */ 

} 

Questa POJO viene riutilizzato nei diversi metodi di richiesta.

Questo sarebbe il mio controller semplificato:

@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 
    } 
} 

Nel metodo POST mi aspetto unico campo foo da impostare, in modo da questa richiesta che non con il prima di annotazioni di cui sopra. Nel metodo PUT mi aspetto che siano impostati sia i campi foo che bar, quindi questa richiesta sarebbe stata completata con successo.

Qual è l'approccio corretto per affrontare questo tipo di situazioni: in un determinato metodo di richiesta non ci si aspetta che tutti i campi vengano riempiti (alcuni campi potrebbero avere valori predefiniti, quindi non si desidera controllare tutti loro, aka creare), e in un altro metodo è necessario controllare tutti i campi (aka aggiornamento).

risposta

9

gruppi utilizzare la convalida:

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) { ... } 

Nota che è necessario Primavera-specifica @Validated in questo caso, perché @Valid non consente di specificare i gruppi.

Consulta anche:

+0

Questa è la risposta perfetta. E 'stata una buona giornata quando hanno implementato https://jira.springsource.org/browse/SPR-6373 – digitaljoel

+0

così tanto da imparare ... Molto apprezzato, grazie! – jarandaf