網(wǎng)站首頁 編程語言 正文
目錄
- 1. 自定義注解
- 2. 注解校驗(yàn)器
- 3. 枚舉
- 4. 使用注解
- 校驗(yàn)深層次的實(shí)體
前言:枚舉校驗(yàn)器主要為了規(guī)范和統(tǒng)一使用固定的字符或者數(shù)字值
SpringBoot 版本 2.xx
依賴,一般使用添加了 spring-boot-starter-web
這個(gè)依賴就行了,他里面包含了數(shù)據(jù)校驗(yàn)的依賴,但還是在這里指明一下具體的依賴。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-validationartifactId>
dependency>
1. 自定義注解
默認(rèn)校驗(yàn) getCode
方法獲取的值。如果要校驗(yàn)枚舉的其他字段,直接指定get方法。
package com.pro.annotation;
import com.pro.annotation.EnumValidtor;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 校驗(yàn)入?yún)⑹欠駷橹付╡num的值的注解
*/
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {EnumValidtor.class})
@Documented
public @interface EnumValid {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<?>[] target() default {};
String vaildField() default "getCode";
}
2. 注解校驗(yàn)器
package com.pro.annotation;
import com.pro.annotation.EnumValid;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 校驗(yàn)入?yún)⑹欠駷橹付╡num的值的實(shí)現(xiàn)方法
*/
public class EnumValidtor implements ConstraintValidator<EnumValid, Object> {
String vaildField;
Class<?>[] cls; //枚舉類
@Override
public void initialize(EnumValid constraintAnnotation) {
cls = constraintAnnotation.target();
vaildField = constraintAnnotation.vaildField();
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value != null && value.toString().length() > 0 && cls.length > 0) {
for (Class<?> cl : cls
) {
try {
if (cl.isEnum()) {
//枚舉類驗(yàn)證
Object[] objs = cl.getEnumConstants();
Method method = cl.getMethod("name");
for (Object obj : objs) {
Object code = method.invoke(obj, null);
if (value.equals(code.toString())) {
return true;
}
}
Method codeMethod = cl.getMethod(vaildField);
for (Object obj : objs) {
Object code = codeMethod.invoke(obj, null);
if (value.toString().equals(code.toString())) {
return true;
}
}
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
} else {
return true;
}
return false;
}
}
3. 枚舉
package com.pro.enums;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public enum GenderEnum {
/**
* 男
*/
MALE("MALE", "男"),
/**
* 女
*/
FEMALE("FEMALE", "女"),
;
private String code;
private String name;
GenderEnum(String code, String name) {
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
public static List<Map<String, Object>> toList() {
List<Map<String, Object>> result = new ArrayList<>();
for (GenderEnum e : GenderEnum.values()) {
Map<String, Object> map = new HashMap<>();
map.put("code", e.getCode());
map.put("value", e.getName());
result.add(map);
}
return result;
}
public static String getNameByCode(String code) {
for (GenderEnum value : values()) {
if (value.code.equals(code)) {
return value.name;
}
}
return "未知";
}
}
4. 使用注解
public class TestDTO {
// 默認(rèn)校驗(yàn) getCode 方法獲取的值
@NotBlank(message = "性別不能為空")
@EnumValid(target = GenderEnum.class, message = "性別輸入錯(cuò)誤")
private String gender;
// 如果想校驗(yàn)枚舉中其他的值, 直接指定 vaildField 方法的值即可, 下面是例子
@NotBlank(message = "性別不能為空")
@EnumValid(target = GenderEnum.class, vaildField = "getName", message = "性別輸入錯(cuò)誤")
private String gender2;
// 此處省略 get、set
}
校驗(yàn)深層次的實(shí)體
這里說一句在 SpringBoot
中默認(rèn)只會(huì)校驗(yàn)第一層實(shí)體類,如果想校驗(yàn)實(shí)體字段中的實(shí)體,需要在字段上加 @Valid
注解。
比如想校驗(yàn) AddDTO
這個(gè)實(shí)體
public class TestDTO {
// 默認(rèn)校驗(yàn) getCode 方法獲取的值
@NotBlank(message = "性別不能為空")
@EnumValid(target = GenderEnum.class, message = "性別輸入錯(cuò)誤")
private String gender;
/**
* 比如想讓 AddDTO 中的字段上的注解校驗(yàn)也生效就必須加上 @Valid 這個(gè)注解
*/
@Valid
private List<AddDTO> addList;
// 此處省略 get、set
}
使用校驗(yàn)
@PostMapping("/update")
public Result updateAdverseRelation(@Validated @RequestBody TestDTO dto) {
}
原文鏈接:https://blog.csdn.net/weixin_44953227/article/details/121841128
相關(guān)推薦
- 2022-11-30 react組件的創(chuàng)建與更新實(shí)現(xiàn)流程詳解_React
- 2024-01-06 RocketMQ死信消息解決方案
- 2022-07-28 pyodps中的apply用法及groupby取分組排序第一條數(shù)據(jù)_python
- 2021-12-05 解析Redis?數(shù)據(jù)結(jié)構(gòu)之簡單動(dòng)態(tài)字符串sds_Redis
- 2023-02-12 C++?STL之string的模擬實(shí)現(xiàn)實(shí)例代碼_C 語言
- 2022-10-07 Qt入門學(xué)習(xí)之?dāng)?shù)據(jù)庫操作指南_C 語言
- 2022-05-04 python運(yùn)算符+條件結(jié)構(gòu)+循環(huán)結(jié)構(gòu)_python
- 2022-10-29 利用platform編寫驅(qū)動(dòng)控制樹莓派4B io口
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支