java自定義驗(yàn)證器的實(shí)現(xiàn)示例
前言
在對(duì)外暴露接口中,我們通常會(huì)對(duì)入?yún)⑦M(jìn)行驗(yàn)證,比如一些字符串非空判斷、數(shù)字最小值最大值這些基礎(chǔ)的判斷在java驗(yàn)證規(guī)范中已經(jīng)提供了,然而這些只是常規(guī)的驗(yàn)證,我們可以通過(guò)自定義注解以及驗(yàn)證器來(lái)進(jìn)行我們自己業(yè)務(wù)上的一些驗(yàn)證,這樣可以避免在業(yè)務(wù)邏輯中添加過(guò)多的驗(yàn)證,降低代碼的可讀性。
使用
1、依賴引入
僅需引入驗(yàn)證包即可,當(dāng)然,如果使用的springboot,可以直接管理依賴,不用指定版本
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
2、自定義注解
這里添加一個(gè)銀行卡驗(yàn)證的注解,其實(shí)核心注解就是@Constraint,這個(gè)注解要求我們的注解中必須有message()groups()以及payload()這三個(gè)方法
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 銀行卡號(hào)校驗(yàn)注解
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
// 這里指定驗(yàn)證器
@Constraint(validatedBy = {BankCardValidator.class})
@Target({ElementType.FIELD,ElementType.ANNOTATION_TYPE,ElementType.PARAMETER})
public @interface BankCardValidity {
/**
* 提示信息
* @return String
*/
String message() default "";
/**
* 是否驗(yàn)證
* @return boolean
*/
boolean required() default true;
/**
* groups
* @return []
*/
Class<?>[] groups() default {};
/**
* payload
* @return []
*/
Class<? extends Payload>[] payload() default {};
}
3、編寫(xiě)驗(yàn)證器
驗(yàn)證器的核心是實(shí)現(xiàn)ConstraintValidator這個(gè)類,第一個(gè)參數(shù)是指定注解,第二個(gè)則是指定的入?yún)?/p>
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 銀行卡號(hào)校驗(yàn)器
*/
public class BankCardValidator implements ConstraintValidator<BankCardValidity,String> {
/**
* 是否強(qiáng)制驗(yàn)證
*/
private boolean required = false;
/**
* 銀行卡號(hào)正則校驗(yàn),這里就是一個(gè)正則驗(yàn)證
*/
private static Pattern patternForBankCardNo = Pattern.compile("^([1-9]{1})(\\d{15}|\\d{18})$");
/**
* 這里就是驗(yàn)證邏輯,返回true驗(yàn)證通過(guò),返回false驗(yàn)證不通過(guò)
*/
@Override
public boolean isValid(String bankCardNo, ConstraintValidatorContext context) {
if (required) {
return isBankCardNo(bankCardNo);
} else {
if (StrUtil.isBlank(bankCardNo)) {
return false;
}
return isBankCardNo(bankCardNo);
}
}
@Override
public void initialize(BankCardValidity validity) {
required = validity.required();
}
/**
* 驗(yàn)證是否為銀行卡號(hào)
* @param bankCardNo 輸入內(nèi)容
* @return boolean
*/
private static boolean isBankCardNo(String bankCardNo) {
// 使用的hutool工具包,也可以使用其它工具包
if (StrUtil.isBlank(bankCardNo)) {
return false;
}
Matcher matcherForBankCardNo = patternForBankCardNo.matcher(bankCardNo);
return matcherForBankCardNo.matches() ;
}
}
至此編碼就完成了,我們可以在注解中添加新的方法,在initialize()方法中使用,或者取值等操作,這都是根據(jù)業(yè)務(wù)場(chǎng)景來(lái)進(jìn)行的。
當(dāng)然,在入?yún)⑿z中,我們肯定也需要把@Valid等注解加上,驗(yàn)證器才會(huì)去驗(yàn)證。
到此這篇關(guān)于java自定義驗(yàn)證器的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)java自定義驗(yàn)證器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Reactor 多任務(wù)并發(fā)執(zhí)行且結(jié)果按順序返回第一個(gè)
這篇文章主要介紹了Reactor 多任務(wù)并發(fā)執(zhí)行且結(jié)果按順序返回第一個(gè),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09
Mybatis讀取和存儲(chǔ)json類型數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了Mybatis讀取和存儲(chǔ)json類型數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
SpringCloud使用Zookeeper作為注冊(cè)中心
這篇文章主要介紹了SpringCloud如何使用Zookeeper作為注冊(cè)中心,幫助大家更好的理解和學(xué)習(xí)使用Zookeeper,感興趣的朋友可以了解下2021-04-04
詳解SpringBoot可執(zhí)行Jar包運(yùn)行原理
SpringBoot有一個(gè)很方便的功能就是可以將應(yīng)用打成可執(zhí)行的Jar,那么大家有沒(méi)想過(guò)這個(gè)Jar是怎么運(yùn)行起來(lái)的呢,本篇博客就來(lái)介紹下 SpringBoot可執(zhí)行Jar包的運(yùn)行原理,需要的朋友可以參考下2023-05-05
SpringBoot的啟動(dòng)過(guò)程源碼詳細(xì)分析
這篇文章主要介紹了SpringBoot的啟動(dòng)過(guò)程源碼詳細(xì)分析,SpringBoot啟動(dòng)的時(shí)候,會(huì)構(gòu)造一個(gè)SpringApplication的實(shí)例,構(gòu)造SpringApplication的時(shí)候會(huì)進(jìn)行初始化的工作,需要的朋友可以參考下2023-11-11
使用spring stream發(fā)送消息代碼實(shí)例
這篇文章主要介紹了使用spring stream發(fā)送消息代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05

