javascript
Spring MVC自定义验证注释
在上一教程中,我展示了如何使用注釋來驗證表單 。 這對于簡單的驗證非常有用,但是最終,您需要驗證一些現成的注釋中沒有的自定義規則。 例如,如果您需要根據輸入的出生日期來驗證用戶已超過21歲,或者可能需要驗證用戶的電話區號在美國內布拉斯加州,該怎么辦。 本教程包含完整的源代碼,將顯示如何創建自定義驗證注釋,您可以在上一教程中探討的JSR-303和Hibernate Validator注釋中使用這些注釋。
如果您想繼續,可以在GitHub上獲取本教程的代碼。
對于此示例,假設我們有一個帶有電話號碼字段和生日日期字段的表單,并且我們要驗證電話號碼是否有效(簡單檢查格式)以及該用戶出生于1989年。支持這些的現成的注釋(據我所知),因此我們將編寫自定義驗證注釋,然后可以重復使用它們,就像內置的JSR-303一樣。
完成后,我們將注釋應用于表單對象,如下所示:
public class Subscriber {...@Phoneprivate String phone;@Year(1989)private Date birthday;// getters setters ...}讓我們開始使用@Phone批注。 我們將創建兩個類: Phone (即批注)和PhoneConstraintValidator其中包含驗證邏輯)。 第一步是創建Phone注釋類:
@Documented @Constraint(validatedBy = PhoneConstraintValidator.class) @Target( { ElementType.METHOD, ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface Phone {String message() default "{Phone}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}上面的代碼大部分只是樣板。 JSR-303規范要求使用批注中的三種方法。 如果我們的注釋接受了任何參數,那么我們將在那里定義為方法。 我們將在本教程后面的下一個批注中看到這一點。 上面的類中最重要的部分是該類上的@Constraint批注,該批注指定我們將使用PhoneConstraintValidator類進行驗證邏輯。 message()方法定義如何解析消息。 通過指定“ {Phone}”,我們可以使用Phone鍵覆蓋Spring資源束中的消息(有關消息的詳細信息,請參見我的其他驗證教程 )。
現在,我們定義約束驗證器:
public class PhoneConstraintValidator implements ConstraintValidator<Phone, String> {@Overridepublic void initialize(Phone phone) { }@Overridepublic boolean isValid(String phoneField, ConstraintValidatorContext cxt) {if(phoneField == null) {return false;}return phoneField.matches("[0-9()-\.]*");}}讓我們看一下上面的代碼。 超類的模板化類型有兩種類型:它支持的注釋的類型和它驗證的屬性的類型(在此示例中為Phone,String)。
“ initialize”方法在此處為空,但可用于保存注釋中的數據,如下面定義其他注釋時所見。
最后,實際的邏輯發生在“ isValid”方法中。 字段值作為第一個參數傳入,我們在這里進行驗證。 如您所見,我只是在驗證電話號碼僅包含數字,括號或破折號。
就是這個注解! 現在可以在字段上使用批注,如上面在我們的表單對象上所示。
現在,讓我們做第二個注釋。 這個有點人為的-我們將驗證用戶的生日是在1989年。不過,將來,我們可能需要驗證日期在其他年份,因此,我們而不是創建用于驗證年份為1989年的注釋。將使用一個參數來指定要驗證的年份。 用法示例:
@Year(1989) private Date birthDate;現在,注釋:
@Documented @Constraint(validatedBy = YearConstraintValidator.class) @Target( { ElementType.METHOD, ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface Year {int value();String message() default "{Year}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}注意“ value()”方法。 這暴露了注釋的“值”參數,我們將使用它傳遞注釋應針對的年份。 其余代碼大部分都是樣板
現在,約束驗證器:
public class YearConstraintValidator implements ConstraintValidator<Year, Date> {private int annotationYear;@Overridepublic void initialize(Year year) {this.annotationYear = year.value();}@Overridepublic boolean isValid(Date target, ConstraintValidatorContext cxt) {if(target == null) {return true;}Calendar c = Calendar.getInstance();c.setTime(target);int fieldYear = c.get(Calendar.YEAR);return fieldYear == annotationYear;}}首先要注意的是,這一次,我們將傳遞到批注中的年份保存為約束驗證器類的成員變量。 這使我們可以在“ isValid”方法中訪問該值。
isValid方法是非常簡單的代碼,可以與令人討厭的Date / Calendar API進行搏斗,以驗證帶注釋的字段的值是否與指定的驗證注釋的年份匹配(我可以在某個時候使用JodaTime發布示例)。 現在,如果我們啟動我們的Web應用程序,我們的兩個驗證就位并可以使用!
就這樣。 我有想念嗎? 有問題嗎? 在評論中讓我知道。
全文: ZIP , GitHub
要運行本教程中的代碼:必須已安裝Gradle 。 克隆GitHub存儲庫或下載ZIP并解壓縮。 打開命令提示符以編碼位置。 運行gradle jettyRunWar。 在瀏覽器中導航到http:// localhost:8080。
翻譯自: https://www.javacodegeeks.com/2013/07/spring-mvc-custom-validation-annotations.html
總結
以上是生活随笔為你收集整理的Spring MVC自定义验证注释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 示例介绍:JavaFX 8打印
- 下一篇: WPS AI正式面向社会开放 率先应用在