2013-07-03 182 views
6

我有一個Spring 3.2應用程序,我創建了一個基於Spring MVC的this示例之後的REST API。現在我在嘗試驗證某些數據用於不同的http方法(例如:POST和PUT方法)時遇到了一些問題。Spring Rest API驗證

這將是一個非常簡化的例子:

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

} 

這POJO在不同請求方法重複使用。

這將是我的簡化控制器:

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

在POST方法我只希望FOO字段設置,所以上述註釋之前這一要求會失敗,。在PUT方法中,我希望設置foo和bar字段,所以這個請求將成功完成。

什麼是正確的方法來處理這種情況:在某種請求方法,你不希望所有的字段被填滿(有些字段可能有默認值,因此你不想檢查所有他們,又名創建),而在另一種方法中,您必須檢查所有字段(又名更新)。

回答

9

使用驗證組:

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

請注意,您需要春天特有的@Validated在這種情況下,因爲@Valid不允許指定組。

參見:

+0

這是一個完美的答案。這是一個很好的一天,他們實施https://jira.springsource.org/browse/SPR-6373 – digitaljoel

+0

這麼多留下來學習......非常感謝,謝謝! – jarandaf