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

目录
相关文章
|
2天前
|
Java Spring 容器
如何解决spring EL注解@Value获取值为null的问题
本文探讨了在使用Spring框架时,如何避免`@Value(&quot;${xxx.xxx}&quot;)`注解导致值为null的问题。通过具体示例分析了几种常见错误场景,包括类未交给Spring管理、字段被`static`或`final`修饰以及通过`new`而非依赖注入创建对象等,提出了相应的解决方案,并强调了理解框架原理的重要性。
22 4
|
2天前
|
前端开发 Java Spring
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
14 2
|
3天前
|
Java Spring 容器
Springboot3.2.1搞定了类Service和bean注解同名同类型问题修复
这篇文章讨论了在Spring Boot 3.2.1版本中,同名同类型的bean和@Service注解类之间冲突的问题得到了解决,之前版本中同名bean会相互覆盖,但不会在启动时报错,而在配置文件中设置`spring.main.allow-bean-definition-overriding=true`可以解决这个问题。
16 0
Springboot3.2.1搞定了类Service和bean注解同名同类型问题修复
|
9天前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
29 2
|
17天前
|
Java Spring 容器
Spring使用异步注解@Async正确姿势
Spring使用异步注解@Async正确姿势,异步任务,spring boot
|
16天前
|
XML Java 数据格式
spring复习03,注解配置管理bean
Spring框架中使用注解配置管理bean的方法,包括常用注解的标识组件、扫描组件、基于注解的自动装配以及使用注解后的注意事项,并提供了一个基于注解自动装配的完整示例。
spring复习03,注解配置管理bean
|
17天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
1天前
|
XML Java 数据格式
Java-spring注解的作用
Java-spring注解的作用
|
6天前
|
监控 Java 数据库
Spring事务中的@Transactional注解剖析
通过上述分析,可以看到 `@Transactional`注解在Spring框架中扮演着关键角色,它简化了事务管理的复杂度,让开发者能够更加专注于业务逻辑本身。合理运用并理解其背后的机制,对于构建稳定、高效的Java企业应用至关重要。
18 0
|
17天前
|
Java Spring
spring boot 启动项目参数的设定
spring boot 启动项目参数的设定