自定义@Validated参数注解

简介: Spring Validated参数校验

一、参数校验的实现

1. 以前参数的校验大都通过编码的方式实现,如 Hutool 实现
StrUtil.isNotEmpty(arg);
StrUtil.isNotNull(arg);
StrUtil.isNotBlank(arg);
……
2. 新成员 @Validated 和 @Valid

关于两者的区别


@Validated是org.springframework.validation.annotation.Validated,支持group分组

@Valid是javax.validation.Valid


实际使用时,可以使用两者的嵌套


更多的高阶使用姿势,可参考:https://segmentfault.com/a/1190000022605819?utm_source=tag-newest

二、自定义一个 @Validated 参数注解

1. 定义注解
packagecom.example.validated.validation;
importjavax.validation.Constraint;
importjavax.validation.Payload;
importjava.lang.annotation.*;
/*** 自定义身份证校验注解** @author miaoxm* @date 2021/12/24*/@Documented@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=IdentityCardNumberValidator.class)
public@interfaceIdentityCardNumber {
Stringmessage() default"身份证号码不合法";
Class<?>[] groups() default {};
Class<?extendsPayload>[] payload() default {};
}
2. 注解校验实现
packagecom.example.validated.validation;
importjavax.validation.ConstraintValidator;
importjavax.validation.ConstraintValidatorContext;
/*** 真正的校验逻辑** @description* 1.必须实现 ConstraintValidator 接口* 2.实现了 ConstraintValidator 接口后即使不进行 Bean 配置,spring 容器也会将这个类进行 Bean 管理* 3.可以在实现了 ConstraintValidator 接口的类中依赖注入其他的 Bean* 4.实现了 ConstraintValidator 接口后必须重写 initialize 和 isValid 这两个方法*   - 其中 initialize 方法主要来进行初始化,通常用来获取自定义注解的属性*   - 其中 isValid 方法主要进行校验逻辑,返回true表示校验通过;返回false表示校验失败* @author miaoxm* @date 2021/12/24*/publicclassIdentityCardNumberValidatorimplementsConstraintValidator<IdentityCardNumber, Object> {
@Overridepublicvoidinitialize(IdentityCardNumberconstraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
    }
@OverridepublicbooleanisValid(Objecto, ConstraintValidatorContextconstraintValidatorContext) {
returncheck(o.toString());
    }
privatebooleancheck(Stringarg) {
// 具体的参数校验实现可以写在这儿returntrue;
    }
}

三、全局异常处理

作用:让校验生效,即参数校验时如果不合法就会抛出异常,我们就可以在全局异常中捕获拦截到,然后进行逻辑处理之后再返回

@RestControllerAdvicepublicclassMyGlobalExceptionHandler {
……}
目录
相关文章
|
11月前
|
缓存 自然语言处理 Java
详解FreeMarker Template:在Spring Boot中实现动态内容生成
详解FreeMarker Template:在Spring Boot中实现动态内容生成
1754 13
【知识分享】Java获取当前日期是第几周且本周是几号到几号
【知识分享】Java获取当前日期是第几周且本周是几号到几号
369 0
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构
|
Java 数据处理
技术分享:高效与灵活并存——Java版通用树形结构转换工具的实现与应用
在软件开发中,树形结构的数据表现形式无处不在,从文件系统的目录树到组织架构的部门树,再到各类产品的分类结构。处理这些具有层级关系的数据时,将其转换为树形结构以便展示和操作显得尤为重要。Java作为一门成熟的编程语言,虽然提供了强大的集合框架,但并未直接提供树形结构转换的内置工具。因此,开发一个高效且灵活的通用树形结构转换工具成为许多项目中的必备需求。
338 2
|
机器学习/深度学习 Ubuntu 机器人
【Ubuntu18配置Anaconda深度学习环境】
【Ubuntu18配置Anaconda深度学习环境】
411 1
|
Java 关系型数据库 数据库连接
greenplum驱动都有哪几个
【5月更文挑战第23天】greenplum驱动都有哪几个
445 4
|
XML JSON 前端开发
response.setcontenttype用法详解
response.setcontenttype用法详解
|
Java 关系型数据库 MySQL
JPA中实体类属性相关注解与数据表列映射详解
JPA中实体类属性相关注解与数据表列映射详解
673 0
|
Web App开发 缓存 Linux
深入理解Linux内核内存管理机制与实现(下)
深入理解Linux内核内存管理机制与实现