首页 > 编程语言 >【Java】使用 validation 完成自定义校验注解

【Java】使用 validation 完成自定义校验注解

时间:2023-06-21 10:55:07浏览次数:56  
标签:Java String 自定义 验证 校验 注解 validation

总括:

validation 让我们简化了开发过程,可以使用简单的一个注解就实现了很多常见的检验数据的功能,同时支持自定义注解。spring-boot-starter-validation 是由 Spring Boot 整合的一套用于处理 validation 的约定化自动配置启动器。Spring 系列框架通过简单的安装依赖即可直接使用 validation 提供的参数校验功能,通过为接口添加 @Valid / @Validated 对特定参数进行校验。

使用方法:

1. 安装依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

  如果已使用 Spring Boot 框架可以不指定版本号,依赖于 Spring Boot 版本。

2. 接口参数添加 @Valid / @Validated 进行参数校验

@RequestMapping("/doLogin")
@ResponseBody
public ResponseBean doLogin(@Valid LoginVo loginVo, HttpServletRequest request, HttpServletResponse response) {
    return userService.doLogin(loginVo, request, response);
}

3. 在需要进行校验的参数的属性上使用 validation 基础注解

/* 空检查 */
@Null			     // 验证对象是否为null
@NotNull		        // 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank	      	// 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty	      	// 检查约束元素是否为NULL或者是EMPTY. 

/* Booelan检查 */
@AssertTrue		      // 验证 Boolean 对象是否为 true  
@AssertFalse	         // 验证 Boolean 对象是否为 false  

/* 长度检查 */
@Size(min=, max=)	   // 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  
@Length(min=, max=)    // 验证注解的元素值长度在min和max区间内

/* 日期检查 */
@Past		          // 验证 Date 和 Calendar 对象是否在当前时间之前  
@Future		          // 验证 Date 和 Calendar 对象是否在当前时间之后  
@Pattern	          // 验证 String 对象是否符合正则表达式的规则

/* 数值检查,建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null */
@Min		      	// 验证 Number 和 String 对象是否大等于指定的值  
@Max		      	// 验证 Number 和 String 对象是否小等于指定的值  
@DecimalMax		     // 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin		     // 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits		          // 验证 Number 和 String 的构成是否合法  
@Digits(integer=,fraction=) // 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。

@Range(min=, max=) // 验证注解的元素值在最小值和最大值之间 @Range(min=10000,max=50000,message="range.bean.wage")

/* 其他检验 */ @Valid // 写在方法参数前,递归的对该对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证) @CreditCardNumber // 信用卡验证 @Email // 验证是否是邮件地址,如果为null,不进行验证,算通过验证。 @ScriptAssert(lang= ,script=, alias=) // 简单脚本校验 @URL(protocol=,host=, port=,regexp=, flags=) // IP地址校验

4. 自定义参数校验注解

  4.1 自定义注解

  可以照抄 @NotNull 等基础校验注解的写法

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {IsMobileValidator.class}
)
public @interface IsMobile {
    boolean required() default true;

    String message() default "手机号码格式错误";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

  4.2 实现 ConstraintValidator 接口,用以实现自定义参数校验逻辑

public class IsMobileValidator implements ConstraintValidator<IsMobile,String> {    
  private boolean required = false;
   /**
   *@Param: {@link  IsMobile } constraintAnnotation
   *@Return: void
   *@TODO: 初始化方法,可以用自定义注解中获取值进行初始化
  **/ @Override public void initialize(IsMobile constraintAnnotation) { required = constraintAnnotation.required(); }     
   /**
   *@Param: {@link  String} value
   *@Param: {@link  ConstraintValidatorContext } constraintValidatorContext
   *@Return: {@link boolean}
   *@TODO: 实际校验自定义注解 value 值
   **/ @Override public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { if(required){ return ValidatorUtil.isMobile(value); }else { if(StringUtils.isEmpty(value)){ return true; }else { return ValidatorUtil.isMobile(value); } } } }

  其中 IsMobile 为自定义注解名(根据个人需求自己命名),isValid 方法具体校验逻辑由个人需求及业务确定。使用时同基础校验注解一般放置在需要校验的参数属性上即可。

  注意:自定义注解上必须有 @Constraint 注解,其中 validatedBy 指定执行校验的类,该类必须实现 ConstraintValidator 接口

标签:Java,String,自定义,验证,校验,注解,validation
From: https://www.cnblogs.com/southtwilight/p/java-note_03.html

相关文章

  • 由JAVA环境变量Classpath与logging.config配置冲突的异常:
     Classpath与logging.config配置冲突异常信息:     ......
  • 到底什么是Java AIO?为什么Netty会移除AOI?一文搞懂AIO的本质!
    本文由得物技术团队Uni分享,即时通讯网收录时有内容修订和大量排版优化。1、引言关于Java网络编程中的同步IO和异步IO的区别及原理的文章非常的多,具体来说主要还是在讨论JavaBIO和JavaNIO这两者,而关于JavaAIO的文章就少之又少了(即使用也只是介绍了一下概念和代码示例)。在深......
  • 10个具体项目生动精彩讲述JavaScript;超级Web应用,构建不再困难
     “JavaScript,就是那种小时候长得很丑,长大了却谁都想要的孩子。”诞生初期,由于很多所谓的“资深”程序员的滥用,让这个孩子饱受质疑,直到前几年DOM技术开始崛起,JavaScript才逐渐恢复了曾经的兴盛。并且,这时的JavaScript更多了一份成熟,少了一缕稚气。JavaScript虽然已经被当......
  • 活学活用流行的JavaScript库——《JavaScript实战》
    媒体评论“本书并不像一本教材,畅读之后,你会觉得它就是一位讲课生动的老师,带领你遨游JavaScript海洋,把你推向技术风浪的前沿,同时又给了你一个功能完备的冲浪板,接下来就是你在风口浪尖上享受JavaScript高潮的时候了。”                  ......
  • java~理解可重入锁
    在Java中,可重入锁(ReentrantLock)是一种同步机制,允许线程在持有锁的情况下再次获取该锁,而不会被自己所持有的锁所阻塞。也就是说,一个线程可以多次获得同一个锁,而不会出现死锁的情况。可重入锁在多线程编程中非常有用,它允许线程在访问共享资源时多次获取锁,而不会引发死锁问题。当一......
  • 【后端面经-java】java线程池满的处理策略
    目录1.线程池介绍1.1基本作用1.2处理流程1.3线程池大小设置1.4线程池参数2.线程池满的处理策略2.1默认--拒绝策略handler3.参考资料1.线程池介绍1.1基本作用对多个线程使用的资源进行集中管理。降低资源消耗:复用线程,降低线程创建和销毁造成的消耗;线程资源管理......
  • 前端Vue自定义列表表格信息展示可用于商品规格参数展示
    前端Vue自定义列表表格信息展示可用于商品规格参数展示 ,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13131效果图如下:使用方法<!--table-list:表格数组数组里对象可自定义字段 --><cc-defineTable:table-list="tableArr"></cc-defin......
  • Java基础之“Double类型,保留两位小数,避免因小数过长导致乱码问题”
    保留两位小数方案一DoubletotalSaleAmount=4.174558045899999E7;DecimalFormatdf=newDecimalFormat("#.##");System.out.println("df.format(totalSaleAmount)="+df.format(totalSaleAmount));方案二DoubletotalSa......
  • java~字节码操作Javassist
    Javassist是一个开源的Java字节码操作库,它提供了一组简单而强大的API,用于在运行时修改和生成Java字节码。Javassist的名称是"JavaProgrammingAssistant"的缩写,它的目标是简化对字节码的操作,使开发人员能够更轻松地实现动态代码生成和修改。Javassist的主要特点包括:简单易用:J......
  • 前端Vue自定义顶部搜索框 热门搜索 历史搜索 用于搜索跳转使用
    前端Vue自定义顶部搜索框热门搜索历史搜索用于搜索跳转使用,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13128效果图如下:自定义顶部搜索框用于搜索跳转使用方法<!--自定义顶部搜索框用于搜索跳转skipUrl:跳转url为绝对路径/pages开......