2013-01-25 55 views
4

將@Valid註釋放在方法參數級別時有什麼用途?Hibernate驗證器。如何使用@Valid註解?

public void (@Valid Person p) {..} 

我創建了一個測試,並傳遞給這個方法的無效對象,但什麼也沒有發生。我除了得到一個例外。

+0

你如何實例化你的對象? 'new'不會觸發驗證器的調用,它需要由容器(Web容器,Java EE容器等)觸發。 – Perception

+0

@Perception我在classpath中包含了所有的Hibernate-validator JAR,所以我認爲它應該可以工作。或沒有 ? – MyTitle

+0

我在下面的答案中包含了一些細節。 – Perception

回答

13

對象上的@Valid註釋是一個指示驗證框架來處理註釋的對象。當在方法的參數上使用時,這被稱爲方法級別驗證。請注意,方法級別驗證是而不是核心規範的一部分,事實上僅當Bean驗證集成到容器類型框架(JSF,CDI,Java EE)中時才受支持。當Bean驗證集成到這樣一個支持容器中時,會發生什麼情況是,由於在bean上調用生命週期方法,容器會在方法參數上檢測JSR 303註釋並觸發關聯bean的驗證。

因此,例如,如果你有在一個JAX-RS資源類中的以下方法的定義:

@Path("/example") 
public class MyExampleResourceImpl { 

    @POST 
    @Path("/") 
    public Response postExample(@Valid final Example example) { 
     // .... 
    } 
} 

postExample方法被調用響應於請求由JAX-RS的容器被處理, example bean將被驗證。對比用,如果你正在運行一個獨立的Java SE應用程序會發生什麼這種行爲:

public class MyMainClass { 
    public static void main(final String[] args) { 
     final MyMainClass clazz = new MyMainClass(); 
     clazz.echo(new Example()); 
    } 

    public Example echo(@Valid final Example example) { 
     // ... 
    } 
} 

在這種情況下,運行後會Example參數觸發驗證,即使你囊括了所有的程序JSR 303運行時JAR。這是因爲沒有實現方法級別驗證的容器可用。該Bean Validation Specification描述這一切在附錄C.一些細節,我引用了一些它低於你的好處:

的方法級的驗證議案

這一主張一直沒有整合納入核心規範 ,不屬於它的一部分。它仍然在這裏出於考古目的, 將被認真考慮這個 規範的未來修訂。這個提議可能會與 規範工件的其餘部分不同步。

注意:Bean驗證提供程序可自由實施此提議,作爲 的特定擴展。例如,可以通過使用Validator.unwrap方法訪問 這樣的特定擴展。

一個流行的需求是提供一個方法和參數級別驗證機制,重用規範的約束描述。此 組API是指通過攔截器框架,如可以使用:

  • 應用框架等
    • JSR-299
  • 像企業Java Beans
  • 方面基於框架組件框架

這些框架可以調用驗證API到 驗證方法 在調用此方法時的參數列表或返回的值。更確切地說,驗證發生在方法調用周圍。 Bean驗證API的這個擴展允許 重用核心引擎以及約束定義和 聲明以進行此類方法級別驗證。

+0

Hibernate Validator自4.2版以來基於附錄提供了特定於提供者的支持方法驗證。請注意,方法驗證將作爲[修訂1.1](http://beanvalidation.org/1.1/spec/1.1.0.beta2/#constraintdeclarationvalidationprocess-methodlevelconstraints)的Bean驗證規範的一部分。 – Gunnar

+0

'在這種情況下,運行程序將不會觸發對Example參數的驗證,'---我正在使用Java EE 5,所以這意味着即使在容器類型框架上我也不能使用@Valid註釋?例如在EJB 3.0方法?我這麼認爲是因爲JSR 303不是Java EE 5的一部分。如果它是正確的,那麼我需要手動創建'Validator'對象並手動驗證我的方法參數?謝謝 – MyTitle

+0

是的,不幸的是,JSR 303與JEE5集成在一起。您需要通過工廠創建您的Validator,然後分別驗證每個bean。 – Perception

相關問題