springboot自定義校驗(yàn)注解的實(shí)現(xiàn)過程
通過谷粒商城項(xiàng)目學(xué)習(xí)了自定義校驗(yàn)器的實(shí)現(xiàn)
近日在學(xué)習(xí)雷神的谷粒商城項(xiàng)目,其中有一個自定義校驗(yàn)的實(shí)現(xiàn),記錄一下學(xué)習(xí)的過程。下面是自定義校驗(yàn)實(shí)現(xiàn)的三個過程。
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、編寫自定義校驗(yàn)注解
1.假如我們要自定義一個校驗(yàn)注解,該注解是判斷該字段是否為0,1。如果不是0或者1,則校驗(yàn)報(bào)錯。
@ListValue(vals={0,1})
private Integer showStatus;2.進(jìn)行自定義注解的創(chuàng)建,注意創(chuàng)建類型為Annotation

3.查看其它自定義注解,發(fā)現(xiàn)都有三個元數(shù)據(jù)
String message() default "{javax.validation.constraints.NotBlank.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};將這三條數(shù)據(jù)編寫進(jìn)入自定義注解里面
4.因?yàn)槲覀冏远x注解還包含了vals這個數(shù)組,所以我們需要創(chuàng)建一個這樣的數(shù)據(jù)數(shù)據(jù)。
int[] vals() default {};5.引入相關(guān)的注解,觀看其他注解,發(fā)現(xiàn)基本上實(shí)現(xiàn)了下面的注解
@Documented
@Constraint(
validatedBy = {ListValueConstraintValidator.class}//使用哪個注解校驗(yàn)器
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})//在那些上面可以使用,方法,字段等
@Retention(RetentionPolicy.RUNTIME)//運(yùn)行時獲取下面是自定義注解整個代碼的實(shí)現(xiàn):
package com.atguigu.common.valid;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(
validatedBy = {ListValueConstraintValidator.class}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
String message() default "{com.atguigu.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] vals() default {};
}二、自定義注解的校驗(yàn)器
1.在自定義注解里面,有一個引用哪個校驗(yàn)器的字段validatedBy,點(diǎn)進(jìn)去看一下,發(fā)現(xiàn)實(shí)現(xiàn)了這個接口:ConstraintValidator

2.創(chuàng)建一個自定義校驗(yàn)器,實(shí)現(xiàn)上面的校驗(yàn)器接口

implements ConstraintValidator<ListValue,Integer>//第一個字段寫入自定義注解的名字,第二個我們校驗(yàn)的屬性是Integer類型,所以填入Integer
3.ConstraintValidator的實(shí)現(xiàn),有兩個方法,一個是初始化,一個是校驗(yàn)
private Set<Integer> set = new HashSet<>();
//初始化方法
@Override
public void initialize(ListValue constraintAnnotation) {
int[] vals = constraintAnnotation.vals();//包含咱們自定義注解中的vals的值[0,1]
for (int val : vals) {
set.add(val);
}
}
//判斷是否校驗(yàn)成功
/**
*
* @param integer 需要判斷的值,比如傳入3,是否符合0,1狀態(tài)
* @param constraintValidatorContext
* @return
*/
@Override
public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
return set.contains(integer);
}三、關(guān)聯(lián)自定義的校驗(yàn)器和自定義的校驗(yàn)注解
在自定義注解里面引入自定義注解的校驗(yàn)器
validatedBy = {ListValueConstraintValidator.class【可以指定多個校驗(yàn)器,校驗(yàn)不同類型的值】}總結(jié)
自定義校驗(yàn)的實(shí)現(xiàn)三個步驟:
1).編寫一個自定義的校驗(yàn)注解
2).編寫一個自定義的校驗(yàn)器
3).關(guān)聯(lián)自定義的校驗(yàn)器和自定義的校驗(yàn)注解validatedBy = {ListValueConstraintValidator.class【可以指定多個校驗(yàn)器,校驗(yàn)不同類型的值】}
到此這篇關(guān)于springboot自定義校驗(yàn)注解的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)springboot自定義校驗(yàn)注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot?使用?Sa-Token?完成注解鑒權(quán)功能(權(quán)限校驗(yàn))
- SpringBoot通過自定義注解實(shí)現(xiàn)參數(shù)校驗(yàn)
- SpringBoot?@GroupSequenceProvider注解實(shí)現(xiàn)bean多屬性聯(lián)合校驗(yàn)的示例代碼
- SpringBoot通過AOP與注解實(shí)現(xiàn)入?yún)⑿r?yàn)詳情
- SpringBoot常見get/post請求參數(shù)處理、參數(shù)注解校驗(yàn)及參數(shù)自定義注解校驗(yàn)詳解
- SpringBoot中@Pattern注解對時間格式校驗(yàn)方式
- SpringBoot自定義注解API數(shù)據(jù)加密和簽名校驗(yàn)
- SpringBoot中自定義注解實(shí)現(xiàn)參數(shù)非空校驗(yàn)的示例
- SpringBoot @Validated注解實(shí)現(xiàn)參數(shù)分組校驗(yàn)的方法實(shí)例
相關(guān)文章
Java項(xiàng)目NoProviderFoundException報(bào)錯的解決方案
在Java開發(fā)中,jakarta.validation.NoProviderFoundException?是一個令人困惑的運(yùn)行時錯誤,常因校驗(yàn)框架依賴缺失或版本沖突導(dǎo)致,本文給大家介紹了Java項(xiàng)目NoProviderFoundException報(bào)錯的解決方案,需要的朋友可以參考下2025-06-06
使用Spring實(shí)現(xiàn)@Value注入靜態(tài)字段
這篇文章主要介紹了使用Spring實(shí)現(xiàn)@Value注入靜態(tài)字段方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Java使用NIO包實(shí)現(xiàn)Socket通信的實(shí)例代碼
本篇文章主要介紹了Java使用NIO包實(shí)現(xiàn)Socket通信的實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02

