自定义@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 {
……}
目录
相关文章
|
4月前
|
Java Spring
springBoot 使用 @NotEmpty,@NotBlank,@NotNull 及@Valid注解校验请求参数
springBoot 使用 @NotEmpty,@NotBlank,@NotNull 及@Valid注解校验请求参数
248 7
|
JSON 数据格式
swagger参数注解,后台使用@RequestBody注解的实体类,但只需要传实体类中的一个属性
这样写的结果会是下面这个样子,导致出现两个参数,一个实体类传参类型是json格式,一个是注解中写的属性。
|
Java 数据库连接 API
java参数校验(@Validated、@Valid)使用详解
java参数校验(@Validated、@Valid)使用详解
4775 0
|
Java Maven Spring
参数校验Spring的@Valid注解用法详解(上)
参数校验Spring的@Valid注解用法详解
280 0
参数校验Spring的@Valid注解用法详解(上)
|
Java Spring
参数校验Spring的@Valid注解用法详解(下)
参数校验Spring的@Valid注解用法详解
110 0
参数校验Spring的@Valid注解用法详解(下)
|
前端开发 Java 应用服务中间件
曾经的你我高攀不起,现在的我只想注解和配置(下)
四、Controller配置总结 实现Controller接口 使用注解开发@Controller
曾经的你我高攀不起,现在的我只想注解和配置(下)
|
前端开发 Java Spring
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(中)
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(中)
|
JSON 前端开发 Java
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(上)
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(上)
|
前端开发 Java Spring
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(下)
@Validated和@Valid的区别?教你使用它完成Controller参数校验(含级联属性校验)以及原理分析【享学Spring】(下)
spring-boot-validator参数校验系列(3)--------自定义校验注解
根据自己的业务规则实现自定义校验注解
1237 0
spring-boot-validator参数校验系列(3)--------自定义校验注解