Hibernate Validation自定義注解校驗(yàn)的實(shí)現(xiàn)
情景:需要對(duì)String類型的屬性比如description進(jìn)行驗(yàn)證,驗(yàn)證規(guī)則是當(dāng)description為空時(shí)不進(jìn)行正則校驗(yàn),description不為空時(shí)進(jìn)行正則校驗(yàn)。上述需求Hibernate Validation沒有可用于上述需求的注解,故自定義一個(gè)注解并自定義校驗(yàn)規(guī)則。
自定義注解進(jìn)行校驗(yàn)的步驟
- 寫一個(gè)校驗(yàn)注解,在注解中指定校驗(yàn)器類,校驗(yàn)注解與校驗(yàn)器一般一一對(duì)應(yīng)。
- 寫一個(gè)校驗(yàn)器類并在校驗(yàn)器類中寫校驗(yàn)邏輯,校驗(yàn)器必須實(shí)現(xiàn)ConstraintValidator<?, ?>接口,第一個(gè)參數(shù)是對(duì)應(yīng)的注解,第二個(gè)參數(shù)是要校驗(yàn)的屬性的類型
代碼示例
校驗(yàn)注解
package com.kunlun.validation.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import com.kunlun.validation.validator.KlPatternValidator;
/**
* 自定義的校驗(yàn)注解
* 規(guī)則:
* 1.如果字符串為空串或者為null,則不進(jìn)行正則校驗(yàn)
* 2.如果字符串不為空串,則必須進(jìn)行正則校驗(yàn)
* @author xc
* @date 2018年1月19日上午11:38:02
*/
@Documented
// 指定該注解可以使用的地方
@Target(value= {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
// 指定實(shí)際進(jìn)行校驗(yàn)的校驗(yàn)器,該校驗(yàn)器是自己寫的且必須實(shí)現(xiàn)ConstraintValidator接口
@Constraint(validatedBy=KlPatternValidator.class)
public @interface KlPattern {
/*
* 用于驗(yàn)證的注解下列這三個(gè)方法必須要,這是Hibernate Validation框架要求的,否則程序再在調(diào)用的時(shí)候會(huì)報(bào)錯(cuò)
* default用于對(duì)屬性給定默認(rèn)值
* 如果不給定默認(rèn)值,則在使用注解的時(shí)候必須給屬性指定屬性值,否則報(bào)錯(cuò)
* 給定默認(rèn)值時(shí),在使用注解的時(shí)候可以不用指定屬性值
*/
String message() default "不符合正則!";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
// 沒加default給定默認(rèn)值,使用注解的時(shí)候該屬性必須賦值,否則報(bào)錯(cuò)
String regex();
// value屬性,加上了default "mercy" 使得該屬性在使用注解的時(shí)候可以不用輸入也不會(huì)報(bào)錯(cuò)
String value() default "mercy";
}
與上面校驗(yàn)注解對(duì)應(yīng)的校驗(yàn)器類
package com.kunlun.validation.validator;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import com.kunlun.validation.annotation.KlPattern;
/**
* KlPatternValidator是KlPattern注解實(shí)際調(diào)用的驗(yàn)證器
* 在KlPatternValidator中完成校驗(yàn)邏輯
*
* @author xc
* @date 2018年1月19日上午11:44:38
*/
public class KlPatternValidator implements ConstraintValidator<KlPattern, String> {
private String regex;
/**
* 通過initialize()可以獲取注解里的屬性值
*/
@Override
public void initialize(KlPattern constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
regex = constraintAnnotation.regex();
}
/**
* 實(shí)際驗(yàn)證邏輯
* 返回值為true表示驗(yàn)證通過,
* 返回值為false表示驗(yàn)證未通過
*/
@Override
public boolean isValid(String s, ConstraintValidatorContext ctx) {
// 當(dāng)前前端傳過來的請(qǐng)求參數(shù)是空串,或者沒傳的時(shí)候,不進(jìn)行后續(xù)正則校驗(yàn)
if ("".equals(s) || s == null) {
return true;
}
// 進(jìn)行正則校驗(yàn)
if(s.matches(regex)) {
return true;
}
return false;
}
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring靜態(tài)代理和動(dòng)態(tài)代理代碼詳解
這篇文章主要介紹了Spring靜態(tài)代理和動(dòng)態(tài)代理代碼詳解,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
使用Spring底層組件實(shí)現(xiàn)Aware接口
這篇文章主要介紹了使用Spring底層組件實(shí)現(xiàn)Aware接口,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
高并發(fā)下如何避免重復(fù)數(shù)據(jù)產(chǎn)生技巧
這篇文章主要為大家介紹了高并發(fā)下如何避免重復(fù)數(shù)據(jù)的產(chǎn)生技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
SpringBoot+Mybatis plus+React實(shí)現(xiàn)條件選擇切換搜索實(shí)踐
本文主要介紹了SpringBoot+Mybatis plus+React實(shí)現(xiàn)條件選擇切換搜索實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Springboot解決ajax+自定義headers的跨域請(qǐng)求問題
由于瀏覽器同源策略(同源策略,它是由Netscape提出的一個(gè)著名的安全策略,現(xiàn)在所有支持JavaScript 的瀏覽器都會(huì)使用這個(gè)策略。接下來通過本文給大家介紹Springboot如何優(yōu)雅的解決ajax+自定義headers的跨域請(qǐng)求 ,需要的朋友可以參考下2019-05-05
Java深入講解instanceof關(guān)鍵字的使用
instanceof 是 Java 的一個(gè)二元操作符,類似于 ==,>,< 等操作符。instanceof 是 Java 的保留關(guān)鍵字。它的作用是測試它左邊的對(duì)象是否是它右邊的類的實(shí)例,返回 boolean 的數(shù)據(jù)類型2022-05-05
使用Java實(shí)現(xiàn)動(dòng)態(tài)生成MySQL數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)動(dòng)態(tài)生成MySQL數(shù)據(jù)庫,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
Java實(shí)現(xiàn)手寫線程池實(shí)例并測試詳解
這篇文章主要來模擬一下線程池和工作隊(duì)列的流程,以及編寫代碼和測試類進(jìn)行測試。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02
mybatis 忽略實(shí)體對(duì)象的某個(gè)屬性(2種方式)
這篇文章主要介紹了mybatis 忽略實(shí)體對(duì)象的某個(gè)屬性方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

