將@Valid註釋放在方法參數級別時有什麼用途?Hibernate驗證器。如何使用@Valid註解?
public void (@Valid Person p) {..}
我創建了一個測試,並傳遞給這個方法的無效對象,但什麼也沒有發生。我除了得到一個例外。
將@Valid註釋放在方法參數級別時有什麼用途?Hibernate驗證器。如何使用@Valid註解?
public void (@Valid Person p) {..}
我創建了一個測試,並傳遞給這個方法的無效對象,但什麼也沒有發生。我除了得到一個例外。
對象上的@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的這個擴展允許 重用核心引擎以及約束定義和 聲明以進行此類方法級別驗證。
Hibernate Validator自4.2版以來基於附錄提供了特定於提供者的支持方法驗證。請注意,方法驗證將作爲[修訂1.1](http://beanvalidation.org/1.1/spec/1.1.0.beta2/#constraintdeclarationvalidationprocess-methodlevelconstraints)的Bean驗證規範的一部分。 – Gunnar
'在這種情況下,運行程序將不會觸發對Example參數的驗證,'---我正在使用Java EE 5,所以這意味着即使在容器類型框架上我也不能使用@Valid註釋?例如在EJB 3.0方法?我這麼認爲是因爲JSR 303不是Java EE 5的一部分。如果它是正確的,那麼我需要手動創建'Validator'對象並手動驗證我的方法參數?謝謝 – MyTitle
是的,不幸的是,JSR 303與JEE5集成在一起。您需要通過工廠創建您的Validator,然後分別驗證每個bean。 – Perception
其目的是根據定義的約束來驗證對象。
遞歸執行相關聯的對象上的驗證。如果 對象是一個集合或一個數組,則遞歸驗證元素 。如果對象是地圖,則遞歸地驗證值元素 。
這可能有助於http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/
你如何實例化你的對象? 'new'不會觸發驗證器的調用,它需要由容器(Web容器,Java EE容器等)觸發。 – Perception
@Perception我在classpath中包含了所有的Hibernate-validator JAR,所以我認爲它應該可以工作。或沒有 ? – MyTitle
我在下面的答案中包含了一些細節。 – Perception