更加灵活的参数校验,Spring-boot自定义参数校验注解
上文测试开发专题:如何在spring-boot中进行参数校验,我们讨论了如何使用@Min、@Max等注解进行参数校验,主要是针对基本数据类型和级联对象进行参数校验的演示,但是在实际中我们往往需要更为复杂的校验规则,比如注册用户的密码和确认密码进行校验,这个时候基本的注解就无法满足我们的要求了,需要去按照业务需求去自定义注解进行校验
元注解
在自定义注解之前我们有必要了解一些元注解,元注解就是在注解上的注解,可以对一个注解进行配置,元注解包括@Retention、@Target、@Document、@Inherited四种
@Retention,表示注解保留到什么时候,有以下三种模式
- @Retention(RetentionPolicy.SOURCE) 表示注解仅存在于源码中,在class字节码文件中不包含
- @Retention(RetentionPolicy.CLASS) 表示 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
- @Retention(RetentionPolicy.RUNTIME) 表示注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target表示注解的作用目标是什么,只列出下面几个,剩余的大家自行谷歌把
- @Target(ElementType.TYPE) 表示注解可以应用于接口、类、枚举、注解
- @Target(ElementType.FIELD) 表示可以应用于字段、成员变量、枚举的常量等
- @Target(ElementType.METHOD)表示可以作用于方法
@Document表示注解包含在javadoc中
@Inherited表示注解可以被继承
自定义校验注解
就以用户注册为例,我们需要校验密码和确认密码是否一致以及是否符合密码的规则,先新建一个PasswordEqual注解类
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Constraint(validatedBy = PasswordValidator.class)
public @interface PasswordEqual {
String message() default "密码不一样";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
下面我们来解释一下上面的注解,在PasswordEqual注解上,又标记了四个注解,前三个我们上面已经说过了。
这里说一下@Constraint注解,它表示这个注解是一个验证注解,并且通过validatedBy指定自定义校验注解的关联类,PasswordValidator类就是我们自定义的注解关联的类。
注解里面的groups和payload方法是模板方法,实现自定义注解必须写这么两个方法。
定义验证类
验证类里面包含具体的验证逻辑了,下面是一个简版的:
public class PasswordValidator implements ConstraintValidator<PasswordEqual, BannerCreateDto> {
@Override
public boolean isValid(BannerCreateDto dto, ConstraintValidatorContext constraintValidatorContext) {
return false;
}
}
这里需要对上面的代码进行一下说明,实现自定义校验类必须实现
ConstraintValidator接口,它是一个泛型接口,需要指定两个类型参数,第一个是自定义注解类型,第二个类型指定自定义注解修饰目标的类型,就是准备把自定义注解标记到什么类型上面。
必须重写isValid方法,所有的校验逻辑都在这个方法里面,下面我们简单写一下:
@Override
public boolean isValid(UserDto dto, ConstraintValidatorContext constraintValidatorContext) {
if (dto.getPassword().equals(dto.getConfirmPassword())){
return true;
}
return false;
}
然后我们将自定义的注解类标记到UserDto类上:
@Builder
@Getter
@Setter
@PasswordEqual
public class UserDto {
@Length(min = 4, max = 10, message = "用户名长度必须在4-10个字符之间")
private String name;
private String password;
private String confirmPassword;
}
接下来我们在写一个简单的创建用户的接口:
@RestController
public class UserController {
@PostMapping("/v2/user/create")
@ResponseBody
public UserDto createUser(@RequestBody @Validated UserDto dto){
return dto;
}
}
注意这里有要使用@ResponseBody能够返回自动序列化自定义对象,并且要写上 @Validated开启校验机制。
我们先输入正确的密码和确认密码一下:

可以看到能够正常的返回数据,这时再把两个密码改的不一样,试试:

这个时候就抛出了异常,这里的异常信息是因为进了全局异常处理器,不清楚的童鞋可以看下之前的文章。我们再来看一下控制台的输出:

控制台已经输出了校验的错误信息。
总结
我们今天介绍了自定义参数校验,并编写了校验注解和校验类,但是最后返回给用户的信息非常不友好,需要针对参数校验错误,能够返回定义的message,能够让有用户明白是哪里错了,下篇文章我们将介绍这块的内容,敬请关注!!
欢迎大家去 我的博客 瞅瞅,里面有更多关于测试实战的内容哦!!
更加灵活的参数校验,Spring-boot自定义参数校验注解的更多相关文章
- spring boot+自定义 AOP 实现全局校验
最近公司重构项目,重构为最热的微服务框架 spring boot, 重构的时候遇到几个可以统一处理的问题,也是项目中经常遇到,列如:统一校验参数,统一捕获异常... 仅凭代码 去控制参数的校验,有时候 ...
- Spring Boot 2.X(四):Spring Boot 自定义 Web MVC 配置
0.准备 Spring Boot 不仅提供了相当简单使用的自动配置功能,而且开放了非常自由灵活的配置类.Spring MVC 为我们提供了 WebMvcConfigurationSupport 类和一 ...
- 玩转Spring Boot 自定义配置、导入XML配置与外部化配置
玩转Spring Boot 自定义配置.导入XML配置与外部化配置 在这里我会全面介绍在Spring Boot里面如何自定义配置,更改Spring Boot默认的配置,以及介绍各配置的优先 ...
- Spring boot 自定义 Resolver 支持 interface 类型参数
在编写 RestController 层的代码时,由于数据实体类定义了接口及实现类,本着面向接口编程的原则,我使用了接口作为 RestController 方法的入参. 代码大致如下(省略具体业务部分 ...
- Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践
Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践 本篇博文主要提供一个在 SpringBoot 中自定义 kafka配置的实践,想象这样一个场景:你的系统 ...
- Spring Boot自定义starter必知必会条件
前言 在目前的Spring Boot框架中,不管是Spring Boot官方还是非官方,都提供了非常多的starter系列组件,助力开发者在企业应用中的开发,提升研发人员的工作效率,Spring Bo ...
- spring boot自定义线程池以及异步处理
spring boot自定义线程池以及异步处理@Async:什么是线程池?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使 ...
- Spring boot 配置文件参数映射到配置类属性
[参考文章]:SpringBoot之@EnableConfigurationProperties分析 [参考文章]:在Spring Boot中使用 @ConfigurationProperties 注 ...
- Spring Boot自定义配置与加载
Spring Boot自定义配置与加载 application.properties主要用来配置数据库连接.日志相关配置等.除了这些配置内容之外,还可以自定义一些配置项,如: my.config.ms ...
- Spring Boot自定义Redis缓存配置,保存value格式JSON字符串
Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 ...
随机推荐
- Windows安装Tesseract-OCR 4.00并配置环境变量
一.前言 Tesseract-OCR 是一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎.与Microsoft O ...
- CSS属性中的display属性浅谈;
首先我们要知道什么是块级元素和行内元素有什么区别: 承接上篇文章:(浅谈HTML和body标签) 块级元素:浏览器解析为独占一行的元素(例如:div.table.ul等.),浏览器会在该元素的前后显示 ...
- JACTF Web部分
掘安团队的题目 平台已不运营 Web签到 发现请求URL为flag.php,但是会跳转到404.php页面,抓包发现有302重定向,查看响应包,flag经过base64编码,解码即可 Tips: 重定 ...
- mybatis源码学习:从SqlSessionFactory到代理对象的生成
目录 一.根据XML配置文件构建SqlSessionFactory 二.通过SqlSessionFactory创建SqlSession 三.getMapper获取动态代理对象 一.根据XML配置文件构 ...
- Spark-BlockManager
简单说明 BlockManager是管理整个Spark运行时数据的读写,包含数据存储本身,在数据存储的基础之上进行数据读写.由于Spark是分布式的,所有BlockManager也是分布式的,Bloc ...
- 通达OA-2017版本漏洞复现
搭建环境 服务器 虚拟机系统版本:Windows Server 2016. 安装服务端 1.下载安装程序 这里我们下载的是2017版本的通达OA服务端: 2.安装程序 配置服务: 漏洞复现 1.任意文 ...
- sql注入学习笔记
1.什么是SQL注入 SQL注入就是指web应用程序对用户输入的数据的合法性没有判断,前端传入后端的参数带有数据库查询的语句,攻击者可以构造不同的SQL语句来实现对数据库的操作. 2.SQL注入原理 ...
- python学习05条件分支
'''if '''a=1b=2if a==b: print(a)print(b) '''与C语言不同,python语言的if格式必须为if 布尔表达式:(冒号不能省略)其二,python有严格的缩进格 ...
- 消息中间件metaq
消息中间件metaq安装并注册到zookper集群 项目地址 https://github.com/killme2008/Metamorphosis Memorphosis是一个消息中间件,它是lin ...
- Manjaro Linux 入门使用教程
Manjaro 初体验 Manjaro 是一款基于 Arch LInux 的自由开源发行版,它吸收了 Arch Linux 优秀丰富的软件管理,同时提供了稳定流畅的操作体验.优雅简单是它的追求,稳定实 ...