Java中@Constraint實(shí)現(xiàn)自定義校驗(yàn)注解
@Constraint
是 Java 中用于定義自定義校驗(yàn)注解的一個(gè)元注解。它通常與 Hibernate Validator 或其他基于 JSR 380(Bean Validation 2.0)的校驗(yàn)框架一起使用。通過(guò) @Constraint
注解,你可以創(chuàng)建自己的校驗(yàn)邏輯,并將其應(yīng)用到實(shí)體類的字段上
1. 創(chuàng)建自定義校驗(yàn)注解
首先,定義一個(gè)自定義校驗(yàn)注解。假設(shè)我們想創(chuàng)建一個(gè)注解 @ValidLength
,用于校驗(yàn)字符串的最大長(zhǎng)度為20位。
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Constraint(validatedBy = ValidLengthValidator.class) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER }) @Retention(RetentionPolicy.RUNTIME) public @interface ValidLength { String message() default "長(zhǎng)度必須在1到20個(gè)字符之間"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; int min() default 1; int max() default 20; }
2. 創(chuàng)建校驗(yàn)器
接下來(lái),創(chuàng)建一個(gè)實(shí)現(xiàn) ConstraintValidator
接口的類,用于實(shí)現(xiàn)具體的校驗(yàn)邏輯。
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class ValidLengthValidator implements ConstraintValidator<ValidLength, String> { private int min; private int max; @Override public void initialize(ValidLength constraintAnnotation) { this.min = constraintAnnotation.min(); this.max = constraintAnnotation.max(); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (value == null) { return true; // 允許為空 } return value.length() >= min && value.length() <= max; } }
3. 應(yīng)用自定義校驗(yàn)注解
在實(shí)體類中使用自定義校驗(yàn)注解。
import javax.validation.constraints.NotNull; public class User { @NotNull @ValidLength(min = 1, max = 20) private String username; // Getters and Setters public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
4. 測(cè)試校驗(yàn)
編寫一個(gè)測(cè)試類來(lái)驗(yàn)證校驗(yàn)邏輯是否按預(yù)期工作。
import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import javax.validation.ConstraintViolation; import java.util.Set; public class Main { public static void main(String[] args) { User user = new User(); user.setUsername("12345678901234567890"); // 20位,合法 ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<User>> violations = validator.validate(user); for (ConstraintViolation<User> violation : violations) { System.out.println(violation.getMessage()); } if (violations.isEmpty()) { System.out.println("校驗(yàn)通過(guò)"); } else { System.out.println("校驗(yàn)失敗"); } } }
輸出
運(yùn)行上述代碼后,如果 username 的長(zhǎng)度在1到20個(gè)字符之間,輸出將是:
校驗(yàn)通過(guò)
如果 username 的長(zhǎng)度超過(guò)20個(gè)字符或小于1個(gè)字符,輸出將是:
長(zhǎng)度必須在1到20個(gè)字符之間
校驗(yàn)失敗
總結(jié)
- 自定義校驗(yàn)注解:使用
@Constraint
注解定義自定義校驗(yàn)注解。 - 校驗(yàn)器:實(shí)現(xiàn)
ConstraintValidator
接口,編寫具體的校驗(yàn)邏輯。 - 應(yīng)用注解:在實(shí)體類的字段上使用自定義校驗(yàn)注解。
- 測(cè)試校驗(yàn):使用
Validator
對(duì)象進(jìn)行校驗(yàn),并處理校驗(yàn)結(jié)果。
到此這篇關(guān)于Java中@Constraint實(shí)現(xiàn)自定義校驗(yàn)注解的文章就介紹到這了,更多相關(guān)Java 自定義校驗(yàn)注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
restTemplate發(fā)送get與post請(qǐng)求并且?guī)?shù)問(wèn)題
這篇文章主要介紹了restTemplate發(fā)送get與post請(qǐng)求并且?guī)?shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Spring security權(quán)限配置與使用大全
Spring Security 本質(zhì)上是借助一系列的 Servlet Filter來(lái)提供各種安全性功能,但這并不需要我們手動(dòng)去添加或者創(chuàng)建多個(gè)Filter,本文重點(diǎn)給大家介紹spring-security的配置與使用及實(shí)現(xiàn)方式,感興趣的朋友一起看看吧2021-09-09Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(29)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07SpringBoot詳細(xì)分析自動(dòng)裝配原理并實(shí)現(xiàn)starter
相對(duì)于傳統(tǒng)意義上的Spring項(xiàng)目,SpringBoot具有開箱即用,簡(jiǎn)化配置,內(nèi)置Tomcat等等等等一系列的特點(diǎn)。在這些特點(diǎn)中,最重要的兩條就是約定優(yōu)于配置和自動(dòng)裝配2022-07-07Java數(shù)據(jù)結(jié)構(gòu)之線段樹的原理與實(shí)現(xiàn)
線段樹是一種二叉搜索樹,是用來(lái)維護(hù)區(qū)間信息的數(shù)據(jù)結(jié)構(gòu)。本文將利用示例詳細(xì)講講Java數(shù)據(jù)結(jié)構(gòu)中線段樹的原理與實(shí)現(xiàn),需要的可以參考一下2022-06-06