2010-08-29 62 views
36

在以下示例中,ScriptFile參數標有@Valid註釋。@Valid註解在Spring中表示什麼?

@Valid註解是做什麼的?

@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)  
public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {  
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");   
    if (result.hasErrors()) {   
     modelMap.addAttribute("scriptFile", scriptFile);    
     modelMap.addAttribute("showcases", ShowCase.findAllShowCases());    
     return "scriptfile/create";    
    }   
    scriptFile.persist();   
    return "redirect:/scriptfile/" + scriptFile.getId();   
}  

回答

26

這是用於驗證目的。

驗證在綁定用戶輸入後,通常驗證 模型。 Spring 3爲JSR-303提供了對 聲明式驗證的支持。 如果某個JSR-303提供程序(如 Hibernate驗證程序)存在於 類路徑中,則會自動啓用此支持 。當啓用時,可以通過 觸發驗證簡單地註釋一個控制器方法 參數與@Valid註釋:0​​結合傳入POST 參數之後,將AppointmentForm 進行驗證;在這種情況下,爲了驗證 日期字段值不爲空,並且將來會發生 。


看看這裏的更多信息:
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/

8

IIRC @Valid不是春註解,但是一個JSR-303的註釋(這是Bean驗證標準)。它所做的主要是檢查你發送給方法的數據是否有效(它會爲你驗證scriptFile)。

1

只需添加上面的答案,在web應用程序中使用 @valid用於要驗證的bean也使用驗證註釋例如註釋。 @NotNull,@Email(hibernate註釋),所以當從用戶獲得輸入時,可以驗證值並且綁定結果將具有驗證結果。 bindingResult.hasErrors()會告訴你是否有任何驗證失敗。

5

添加到上面的答案,看看下面。 AppointmentForm的日期列注有幾個註釋。通過在AppointmentForm上觸發驗證的@Valid註釋(在這種情況下@NotNull和@Future)。這些註釋可能來自不同的JSR-303提供者(例如,Hibernate,Spring ..等等)。

@RequestMapping(value = "/appointments", method = RequestMethod.POST) 
    public String add(@Valid AppointmentForm form, BindingResult result) { 
     .... 
    } 

    static class AppointmentForm { 

     @NotNull @Future 
     private Date date; 
    } 
1
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {  
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");   

我想這@NotNull註釋是有效的,因此如果不需要條件。

3

@Valid本身與Spring無關。它是Bean驗證規範的一部分(其中有幾個,最新的一個是截至2017年下半年的JSR 380),但是@Valid非常陳舊,並且從JSR 303一路獲得。

衆所周知, Spring非常擅長提供與所有不同的JSR和Java庫(通常是JPA,JTA,Caching等)的集成,當然這些人也負責驗證。其中一個關鍵部分是MethodValidationPostProcessor

試圖回答你的問題 - @Valid非常方便所謂的驗證級聯,當你想驗證一個複雜的圖形而不僅僅是一個對象的頂級元素。每當你想深入,你必須使用@Valid。這就是JSR規定的。 Spring會遵守那些帶有一些小偏差的例子(例如我試着把@Validated而不是@Valid放在RestController方法和驗證工作上,但是對於一個普通的「服務」bean也是如此)。

相關問題