zoukankan      html  css  js  c++  java
  • SpringBoot自定义校验注解校验日期时间格式字符串

    1 概述

    后台单独对接收到的参数进行验证时比较麻烦,springboot项目的web组件(spring-boot-starter-web)集成了hibernate-validator,开发者可以直接使用hibernate-validator提供的注解对数据进行校验,当有一些复杂的参数校验时我们也可以自定义校验注解

    2、先定义一个注解

    package com.ideatech.ams.ws.validate;
    
    import javax.validation.Constraint;
    import javax.validation.Payload;
    import java.lang.annotation.*;
    
    @Target({ElementType.FIELD, ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Constraint(validatedBy = DateTimeValidator.class)
    public @interface DateTimeStr {
    
        String message() default "{javax.validation.constraints.DateTimeStr.message}";
    
    
        String format() default "yyyy-MM-dd HH:mm:ss";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }

       @Constraint,指定校验类
        message,失败提示信息
        groups,分组验证(后面介绍)
        payload,不知道,欢迎留言探讨

    2、编写校验类

    package com.ideatech.ams.ws.validate;
    
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import java.lang.annotation.Annotation;
    import java.text.SimpleDateFormat;
    
    public class DateTimeValidator implements ConstraintValidator<DateTimeStr,String>{
    
        private  DateTimeStr  dateTimeStr;
    
    
        @Override
        public void initialize(DateTimeStr dateTimeStr) {
            this.dateTimeStr=dateTimeStr;
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            // 如果 value 为空则不进行格式验证,为空验证可以使用 @NotBlank @NotNull @NotEmpty 等注解来进行控制,职责分离
            if (value == null) {
                return true;
            }
            String format = dateTimeStr.format();
    
            if (value.length() != format.length()) {
                return false;
            }
    
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
    
            try {
                simpleDateFormat.parse(value);
            } catch (Exception e){
                return false;
            }
    
    
            return true;
        }
    }

    1:必须实现ConstraintValidator接口

    2:实现了ConstraintValidator接口后即使不进行Bean配置,spring也会将这个类进行Bean管理

    3:可以在实现了ConstraintValidator接口的类中依赖注入其它Bean

    4:实现了ConstraintValidator接口后必须重写 initialize 和 isValid 这两个方法;initialize方法主要来进行初始化,通常用来获取自定义注解的属性值;isValid 方法主要进行校验逻辑,返回true表示校验通过,返回false表示校验失败,通常根据注解属性值和实体类属性值进行校验判断

        /**
         * 银行通知客户临柜时间(必填)
         */
        @NotBlank(message="银行通知客户临柜时间不能为空")
        @DateTimeStr(format ="yyyy-MM-dd HH:mm:ss", message = "格式错误,正确格式为:yyyy-MM-dd HH:mm:ss")
        private String bankApplyTime;

  • 相关阅读:
    线程池:第一章:线程池的底层原理
    实战:第一章:防止其他人通过用户的url访问用户私人数据
    java程序报错:Unable to open debugger port (127.0.0.1:63959): java.net.SocketException "socket closed",编译过来就是无法打开调试器端口,套接字已关闭
    面试:第十三章:中高级程序员面试
    队列:第一章:阻塞队列
    我的分享:第三章:SpringCould五大组件
    Linux系统:第十章:服务器环境搭建
    深入理解JUC:第六章:Semaphore信号灯
    编写高质量JS代码的68个有效方法(十三)
    前端构建之gulp与常用插件
  • 原文地址:https://www.cnblogs.com/zouhong/p/15319095.html
Copyright © 2011-2022 走看看