網站首頁 編程語言 正文
目錄
- 1. 自定義注解
- 2. 注解校驗器
- 3. 枚舉
- 4. 使用注解
- 校驗深層次的實體
前言:枚舉校驗器主要為了規范和統一使用固定的字符或者數字值
SpringBoot 版本 2.xx
依賴,一般使用添加了 spring-boot-starter-web
這個依賴就行了,他里面包含了數據校驗的依賴,但還是在這里指明一下具體的依賴。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-validationartifactId>
dependency>
1. 自定義注解
默認校驗 getCode
方法獲取的值。如果要校驗枚舉的其他字段,直接指定get方法。
package com.pro.annotation;
import com.pro.annotation.EnumValidtor;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 校驗入參是否為指定enum的值的注解
*/
@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. 注解校驗器
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;
/**
* 校驗入參是否為指定enum的值的實現方法
*/
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()) {
//枚舉類驗證
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 {
// 默認校驗 getCode 方法獲取的值
@NotBlank(message = "性別不能為空")
@EnumValid(target = GenderEnum.class, message = "性別輸入錯誤")
private String gender;
// 如果想校驗枚舉中其他的值, 直接指定 vaildField 方法的值即可, 下面是例子
@NotBlank(message = "性別不能為空")
@EnumValid(target = GenderEnum.class, vaildField = "getName", message = "性別輸入錯誤")
private String gender2;
// 此處省略 get、set
}
校驗深層次的實體
這里說一句在 SpringBoot
中默認只會校驗第一層實體類,如果想校驗實體字段中的實體,需要在字段上加 @Valid
注解。
比如想校驗 AddDTO
這個實體
public class TestDTO {
// 默認校驗 getCode 方法獲取的值
@NotBlank(message = "性別不能為空")
@EnumValid(target = GenderEnum.class, message = "性別輸入錯誤")
private String gender;
/**
* 比如想讓 AddDTO 中的字段上的注解校驗也生效就必須加上 @Valid 這個注解
*/
@Valid
private List<AddDTO> addList;
// 此處省略 get、set
}
使用校驗
@PostMapping("/update")
public Result updateAdverseRelation(@Validated @RequestBody TestDTO dto) {
}
原文鏈接:https://blog.csdn.net/weixin_44953227/article/details/121841128
相關推薦
- 2022-09-16 go數據結構和算法BitMap原理及實現示例_Golang
- 2022-09-17 Python中re.findall()用法詳解_python
- 2022-11-23 Python?threading模塊中lock與Rlock的使用詳細講解_python
- 2023-11-15 Latex解決表格過寬問題,自適應調整寬度;自動調整適合的表格大小
- 2022-11-14 JVM中的垃圾回收
- 2022-12-23 淺析Go語言中Channel的各種用法_Golang
- 2022-04-18 python中的selenium實現自動向下滾動頁面并指定最大滑動距離_python
- 2023-06-04 Pandas.DataFrame重置列的行名實現(set_index)_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支