@Valid用于校验,其作用与@Validata效果基本相同,今天主要就是解决一个参数需要匹配多个正则表达式来校验是否通过的情况。

例如说:前端传给后端一个电话号码,既可能是手机号,也有可能是座机号,这样的话我们在字段上写一个@Pattern,然后为期自定义一条正则表达式显然是不能满足需求的,而且代码也显得杂乱不利于代码的复用。可以将其抽取出来作为一个注解就可以完美解决。

这两个依赖缺一不可

        <dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId></dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency>

需要做一些准备工作

/*** 实体*/
@Data
public class Contacts {/*** 联系人姓名*/@NotBlank(message = "联系人姓名不能为空")private String contactsName;/*** 联系人手机/电话号*/@Phoneprivate String phoneNum;
}
/*** 全局响应实体*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {/*** 请求结果*/private Boolean flag;/*** 响应信息*/private String message;/*** 响应内容*/private Object result;/*** 有异常时返回结果*/public static Result myError(List<ObjectError> constraintViolations) {Result result = new Result();result.setFlag(false);Set<String> setMessage = new HashSet<>();for (ObjectError message : constraintViolations) {setMessage.add(message.getDefaultMessage());}result.setMessage(setMessage.toString());return result;}
}
/*** 全局异常处理*/
@RestControllerAdvice
public class GlobalExceptionHandler {/*** 参数校验全局异常*/@ExceptionHandler(MethodArgumentNotValidException.class)public Result handlerValidator(MethodArgumentNotValidException e) {BindingResult result = e.getBindingResult();List<ObjectError> allErrors = result.getAllErrors();return Result.myError(allErrors);}
}

自定义一个电话号码校验的注解,注意上面@interface只是定义出来了这个注解,没有定义它的校验规则,所义需要重新写一个类实现 ConstraintValidator<A extends Annotation, T>用来校验

@Documented
@Target({ElementType.FIELD, ElementType.PARAMETER}) //定义可以在字段上使用
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = Phone.PhoneCheck.class) //指定校验规则的类
public @interface Phone {String message() default "请输入正确的手机号码";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};/*** 校验规则*/@Componentclass PhoneCheck implements ConstraintValidator<Phone, String> {@Overridepublic boolean isValid(String phone, ConstraintValidatorContext constraintValidatorContext) {// 国内移动用户正则表达式Pattern pattern = Pattern.compile("^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$");if (pattern.matcher(phone).matches()) {return true;}// 国内固定号码正则表达式pattern = Pattern.compile("\\d{3}-\\d{8}|\\d{4}-\\d{7}");if (pattern.matcher(phone).matches()) {return true;}String template = constraintValidatorContext.getDefaultConstraintMessageTemplate();System.out.println(template);return pattern.matcher(phone).matches();}}
}

测试,如果在controller层使用的话需要加上@Valid注解

@RestController
@Slf4j
public class ContactsController {@SneakyThrows@PostMapping("/contacts")public Result message(@Valid @RequestBody Contacts contacts) {log.info(contacts.toString());return new Result(true,"校验通过",contacts);}
}

如果校验通过的话,参数不会有异常抛出则会返回一个校验通过的消息,反之则会被自定义的全局异常处理捕获到,返回响应的异常信息。

测试结果:

可以看到无论是固定电话还是移动电话都可以校验成功。

再来个失败的情况

两个校验都没有通过

基于@Valid注解自定义参数校验相关推荐

  1. 自定义检验注解_多注解自定义参数校验

    好久直接更新了单个注解参数校验以后.偷懒了好久,今天就把多个注解自定义的参数校验写了一下,思路是一样的,只是一个注解包含的字段把它分解成了多个注解,类似于java-valid自带的不同功能的校验注解一 ...

  2. e0312 不存在用户定义的_更加灵活的参数校验,Spring-boot自定义参数校验注解

    上文我们讨论了如何使用@Min.@Max等注解进行参数校验,主要是针对基本数据类型和级联对象进行参数校验的演示,但是在实际中我们往往需要更为复杂的校验规则,比如注册用户的密码和确认密码进行校验,这个时 ...

  3. SpringBoot - 优雅的实现【自定义参数校验】高级进阶

    文章目录 Pre 概述 三部曲 Step1 搞自定义注解 Step2 搞校验逻辑 Step3 使用 Step4 验证 附 int 类型的判断 源码 Pre SpringBoot - 优雅的实现[参数校 ...

  4. @valid注解_springboot使用自定义注解对接口参数校验

    目的: 对自定义注解有更好的认识,让参数校验变得更加简洁.灵活.方便. 正文: 首先,在pom文件引入hibernate的校验依赖 1.自定注解:(注意要加@Constraint约束) @Target ...

  5. SpringBoot @Validated注解实现参数校验

    1. 前言 做web开发有一点很烦人就是要校验参数,基本上每个接口都要对参数进行校验,比如一些格式校验 非空校验都是必不可少的.如果参数比较少的话还是容易 处理的一但参数比较多了的话代码中就会出现大量 ...

  6. spring注解式参数校验

    转载自 https://blog.csdn.net/jinzhencs/article/details/51682830 一般入参我们都会转为vo对象.那么直接在对象的属性上注解即可.  其实spri ...

  7. notnull注解_参数校验注解Validated和Valid的区别,这次终于有人说清楚了

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...

  8. mybatis if test 判断参数_什么?你还在if判断参数?Spring Boot 注解进行参数校验真香...

    一.依赖 org.springframework.bootspring-boot-starter-validation2.3.3.RELEASE 二.实体类 @TableField("use ...

  9. 【Spring】Spring hibernate JSR-303 Validator 自定义参数校验器

    1.概述 在默认的情况下 Spring Boot 会引入关于 Hibernate Validator 机制来支持 JSR-303 验证规范:另外一方面 , 因为业务会 比较复杂,所以需要 自 定义验证 ...

  10. springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)...

    一.引入相应的maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

最新文章

  1. 趣事:一根网线发起的攻击
  2. Radware发布2015-2016年全球应用及网络安全报告
  3. AgileConfig 1.5 发布 - 支持多环境配置
  4. Find the Kth number(找第K大数)
  5. 需要用sq语句 修改大批量用户的密码_网站文章seo优化及修改已收录文章建议
  6. php phpexcel导入excel
  7. (转)利用Eclipse创建maven项目并生成META-INF和WEB-INF目录
  8. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-链表
  9. 计算机学院毕业语录,毕业的句子简单到哭的_毕业语录
  10. 人体大脑是如何产生压力的,脑体的机制变化过程
  11. AI绘图–Disco Diffusion使用指南+本地化保姆级教程
  12. Linux命令之测试网络连通状态ping
  13. n条线段可以组成多少种三角形
  14. SNS(社交类)的评论排序问题汇总
  15. 网络基础知识 TCP UDP IP
  16. 最新仿商城发卡网源码,带图片展示
  17. Arduino系列-Wemos D1 WIFI UNO R3开发版的智能家居
  18. 信号完整性分析心得体会_电路实验的实验心得体会
  19. 基于Jenkins+git+gradle+pgyer的android持续集成
  20. DECLARE CURSOR FOR的使用

热门文章

  1. 计算机固态加机械硬盘,在台式机中添加固态/机械硬盘驱动器,让我与这篇文章一起教你...
  2. 斑马Zebra 170Xi4 打印机驱动
  3. 【数据仓库】6.数据质量监控
  4. git两个分支代码合并
  5. 龙门浩职高计算机学校,重庆市龙门浩职业中学校|龙门浩职高是公办还是民办院校/文凭怎么样/是什么性质...
  6. 敬仰之情犹如滔滔江水。。。
  7. UG 10.0打开装配图不产生零件图
  8. 对Volterra级数公式的理解-1
  9. 8、16、32-BIT系列单片机区别与特点
  10. 如何使用Keil5开发MSP430及Tiva系列开发板