[英]Hibernate Validator. How to work with @Valid annotation?
將@Valid
注釋放在方法參數級別時有什么用途?
public void (@Valid Person p) { ... }
我創建了一個測試,並將此方法傳遞給非有效對象,但沒有任何反應。
我希望得到一個例外。
對象上的@ Valid
注釋表示驗證框架處理帶注釋的對象。 當在方法的參數上使用時,這被稱為方法級驗證 。 請注意,方法級別驗證不是核心規范的一部分,實際上只有在將Bean Validation集成到容器類型框架(JSF,CDI,Java EE)中時才支持。 當Bean Validation集成到這樣的支持容器中時,會發生的是,當在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) {
// ...
}
}
在這種情況下,即使您包含了所有JSR 303運行時JAR,運行該程序也不會觸發Example
參數的驗證。 這是因為沒有可用的容器實現方法級別驗證。 Bean驗證規范在附錄C中詳細描述了所有這些。為了您的利益,我在下面引用了一些內容:
方法級驗證的提案
該提議尚未納入核心規范,也不屬於核心規范。 它仍然存在於考古目的,並將在未來對本規范進行修訂時予以認真考慮。 該提議可能與其他規范工件有點不同步。
注意: Bean Validation提供程序可以自由地將此提議實現為特定擴展。 例如,可以通過使用Validator.unwrap方法來訪問這種特定擴展。
一種流行的需求是提供重用規范的約束描述的方法和參數級驗證機制。 這組API旨在由攔截器框架使用,例如:
- 應用程序框架如
- JSR-299
- 像Enterprise Java Beans這樣的組件框架
- 基於方面的框架
調用此方法時,這些框架可以調用驗證API來驗證參數列表或方法的返回值。 更准確地說,驗證發生在方法調用周圍。 Bean Validation API的此擴展允許重用核心引擎以及此類方法級別驗證的約束定義和聲明。
其目的是根據定義的約束驗證對象。
在關聯對象上遞歸執行驗證。 如果對象是集合或數組,則遞歸驗證元素。 如果對象是地圖,則遞歸驗證值元素。
這可能會有所幫助http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.