2015-11-16 12 views
6

Stiamo creando un'API RESTful con SpringMVC e abbiamo un endpoint/prodotti in cui POST può essere utilizzato per creare un nuovo prodotto e PUT per aggiornare i campi. Stiamo anche utilizzando javax.validation per convalidare i campi.Come utilizzare SpringMVC @Valid per convalidare i campi in POST e solo i campi null in PUT

In POST funziona bene, ma in PUT l'utente può passare solo un campo e non è possibile utilizzare @Valid, quindi sarà necessario duplicare tutte le convalide effettuate con l'annotazione con codice java per PUT.

Qualcuno sa come estendere l'annotazione @Valid e creare qualcosa come @ValidPresents o qualcos'altro che risolva il mio problema?

risposta

6

È possibile utilizzare i gruppi di convalida con l'annotazione Spring org.springframework.validation.annotation.Validated.

Product.java

class Product { 
    /* Marker interface for grouping validations to be applied at the time of creating a (new) product. */ 
    interface ProductCreation{} 
    /* Marker interface for grouping validations to be applied at the time of updating a (existing) product. */ 
    interface ProductUpdate{} 

    @NotNull(groups = { ProductCreation.class, ProductUpdate.class }) 
    private String code; 

    @NotNull(groups = { ProductCreation.class, ProductUpdate.class }) 
    private String name; 

    @NotNull(groups = { ProductCreation.class, ProductUpdate.class }) 
    private BigDecimal price; 

    @NotNull(groups = { ProductUpdate.class }) 
    private long quantity = 0; 
} 

ProductController.java

@RestController 
@RequestMapping("/products") 
class ProductController { 
    @RequestMapping(method = RequestMethod.POST) 
    public Product create(@Validated(Product.ProductCreation.class) @RequestBody Product product) { ... } 

    @RequestMapping(method = RequestMethod.PUT) 
    public Product update(@Validated(Product.ProductUpdate.class) @RequestBody Product product) { ... } 
} 

Con questo codice in atto, Product.code, Product.name e Product.price verrà convalidato al momento della creazione e aggiornamento. Product.quantity, tuttavia, verrà convalidato solo al momento dell'aggiornamento.