spring-boot-validator参数校验系列(3)--------自定义校验注解

简介: 根据自己的业务规则实现自定义校验注解

前言

目录

spring-boot-validator参数校验系列(1)--------基本参数校验

spring-boot-validator参数校验系列(2)--------分组校验

spring-boot-validator参数校验系列(3)--------自定义校验注解

spring-boot-validator参数校验系列(4)--------自定义参数校验异常


一、为什么要自定义注解?

   因为常见的注解满足不了我们的业务需求,比如,我们限制某个属性只能是固定的值!

二、如何实现

(1)首先完成基本校验spring-boot-validator参数校验系列(1)--------基本参数校验

(2)创建自定义注解

importjavax.validation.Constraint;
importjavax.validation.Payload;
importjava.lang.annotation.*;
/*** @Description : 自定义校验注解*/@Documented@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER})
//FixedValidatorClass 为执行判断逻辑实现类!@Constraint(validatedBy=FixedValidatorClass.class)
public@interfaceFixed {
String[] value() default {};
Stringmessage() default"请输入合法值!";
Class<?>[] groups() default {};
Class<?extendsPayload>[] payload() default {};
}

(3)创建注解判断逻辑类

importjavax.validation.ConstraintValidator;
importjavax.validation.ConstraintValidatorContext;
importjava.util.Arrays;
importjava.util.Objects;
/*** 状态标记校验器*/publicclassFixedValidatorClassimplements//Fixed为我们自定的注解,查看ConstraintValidator可知,第一个泛型参数必须继承Annotation,也就是必须是个注解第二个参数为此注解支持的校验类型,可以理解为@Fixed注解中的value返回类型ConstraintValidator<Fixed,Object> {
privateString[] values;
//初始化参数@Overridepublicvoidinitialize(Fixedfixed) {
//根据用户填写的value值,来初始化此属性只支持的值!this.values=fixed.value();
    }
@OverridepublicbooleanisValid(Objectvalue, ConstraintValidatorContextcontext) {
//具体的判断逻辑//是否为null,以及初始化值中是否包传入的值.//false表示校验失败,参数不合法!returnObjects.isNull(value) 
||Arrays.asList(values).contains(String.valueOf(value));
    }
}

(3)属性上增加自定义注解

我们的"老用户"了

@DatapublicclassMyPerson {
@NotBlank(message="id不可为空!",groups= {Update.class})
privateStringid;
@Size(max=8,min=1, message="用户名超出长度范围!")
privateStringname;
//这里以性别为例,只能输入0(女),1(男)@Fixed(value= {"0","1"},groups= {Insert.class,Update.class},message="请输入合法值!")
@NotNullprivateIntegersex;
}

Controller代码,注意@Validated 位置,看过校验系列文章第一篇的老读者,应该知道这个注解可以写在类上面的,但是经测试,卸载类上,不生效,具体原因尚不清楚,使用时注意下!

@RequestMapping("/custom")
publicvoidcustom(@RequestBody@ValidatedMyPersonmyPerson){
log.info("校验通过,用户信息为: {}",myPerson);
    }


PostMan访问

image.png

后台输出

image.png

目录
相关文章
|
10天前
|
Java 数据库连接 Spring
Spring Boot命令行启动添加参数
Spring Boot命令行启动添加参数
|
28天前
|
XML Java 数据库连接
spring boot 参数的过滤注解与实战
在Spring Boot应用中,对于入参的过滤,通常会涉及到对Web层的数据验证和处理。Spring Boot借助Spring框架提供了强大的验证框架支持,主要基于JSR-303/JSR-380(Bean Validation API)规范,以及Spring自身的@Valid或@Validated注解来实现请求参数的验证。以下是一些常见的使用案例来展示如何对参数进行过滤和验证。
24 1
|
1月前
|
Java Spring 容器
【Java】Spring如何扫描自定义的注解?
【Java】Spring如何扫描自定义的注解?
35 0
|
1月前
|
Java 测试技术 数据库
SpringBoot:@Profile注解和Spring EL
SpringBoot:@Profile注解和Spring EL
|
1月前
|
Java API 开发者
Spring中@import注解终极揭秘
在Spring框架中,@Import注解可以用来引入一个或多个组件,这些组件通常是通过@Bean注解定义的,当使用@Import注解时,实际上是在告诉Spring:“除了当前配置类中的bean定义外,还想包含另一个配置类(或多个配置类)中定义的bean。”
Spring中@import注解终极揭秘
|
1月前
|
存储 缓存 Java
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
|
1月前
|
Java 数据库 Spring
【spring(四)】Spring事务管理和@Transactional注解
【spring(四)】Spring事务管理和@Transactional注解
|
1月前
|
Java Spring 容器
Spring中@Autowired和@Resource注解异同点
Spring中@Autowired和@Resource注解异同点
31 0
|
7天前
|
XML Java 数据格式
进阶注解探秘:深入Spring高级注解的精髓与实际运用
进阶注解探秘:深入Spring高级注解的精髓与实际运用
24 2
|
7天前
|
XML Java 数据格式
从入门到精通:Spring基础注解的全面解析
从入门到精通:Spring基础注解的全面解析
25 2
从入门到精通:Spring基础注解的全面解析