自定义@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 {
……}
目录
相关文章
|
2月前
|
JSON Java 数据格式
springboot全局异常实现以及@Valid和@Validated优雅实现入参验证
springboot全局异常实现以及@Valid和@Validated优雅实现入参验证
152 0
|
12月前
|
JSON 数据格式
swagger参数注解,后台使用@RequestBody注解的实体类,但只需要传实体类中的一个属性
这样写的结果会是下面这个样子,导致出现两个参数,一个实体类传参类型是json格式,一个是注解中写的属性。
|
Java 数据库连接 API
java参数校验(@Validated、@Valid)使用详解
java参数校验(@Validated、@Valid)使用详解
3811 0
|
安全 Java 数据库连接
2. Bean Validation声明式校验方法的参数、返回值
2. Bean Validation声明式校验方法的参数、返回值
|
JSON 前端开发 Java
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(上)
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(上)
|
前端开发 Java Spring
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(中)
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(中)
|
前端开发 Java Spring
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(下)
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(下)
|
Java 编译器
自定义Annotation(二)上
注解Annotation 很强大,很重要,是不是想要自己能够编写注解呢? 接下来,我们就可以尝试编写简单的注解了。
100 0
自定义Annotation(二)上
|
Java Maven Spring
参数校验Spring的@Valid注解用法详解(上)
参数校验Spring的@Valid注解用法详解
252 0
参数校验Spring的@Valid注解用法详解(上)