zoukankan      html  css  js  c++  java
  • springboot数据格式验证(二)——自定义日期格式验证

    上篇文章说javax.validation包与hibernate-validator包中注解能解决80%的问题,那剩下20%的问题咋解决?

    答案是自定义注解来解决

    我们在工作中经常需要对日期格式进行定义,如果客户端传来的日期字符串不符合要求,那么根本无法保存,但是已有的注解并没有日期格式的验证,那我们就自己实现一个

    一、自定义日期格式验证的注解@DateFormat

    注解里需要写明用来具体处理验证逻辑的类,这里对应的就是DateFormatValidator.class

    @Target({ElementType.PARAMETER, ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = DateFormatValidator.class)
    public @interface DateFormat {
        String message() default "日期格式错误";
    
        String format() default "yyyy-MM-dd";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }

    二、验证逻辑处理类

    public class DateFormatValidator implements ConstraintValidator<DateFormat, String> {
    
        private DateFormat dateFormat;
    
        @Override
        public void initialize(DateFormat dateFormat) {
            this.dateFormat = dateFormat;
        }
    
        @Override
        public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
            String format = dateFormat.format();
            if (format.equals("yyyy-MM")) {
                DateTimeFormatter dtf1 = new DateTimeFormatterBuilder()
                        .appendPattern(format)
                        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
                        .toFormatter();
                try {
                    LocalDate.parse(s, dtf1);
                } catch (Exception e) {
                   return false;
                }
            } else {
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
                try {
                    simpleDateFormat.parse(s);
                } catch (Exception e) {
                    return false;
                }
            }
            return true;
        }
    }

    这个月数据yyyy-MM需要特殊处理的原因在于,如果提供的是yyyy-MM-dd的格式的字符串,使用SimpleDateFormat("yyyy-MM")去解析也不会失败

    三、自定义注解的应用

    public class Tables implements Serializable {
    
        private static final long serialVersionUID = -3596411984380984035L;
    
        @ApiModelProperty("表名,必须为英文小写")
        @NotNull(message = "tbName不能为空")
        private String tbName;
    
        @ApiModelProperty("表描述")
        @NotNull(message = "chineseName不能为空")
        private String chineseName;
    
        @ApiModelProperty("表唯一键")
        private String uniqueKey;
    
        @ApiModelProperty("创建日期")
        @DateFormat(format = "yyyy-MM-dd",message = "日期格式错误,正确格式为yyyy-MM-dd")
        private String createDate;
    }

    四、controller层的使用

    @PostMapping("addTable")
        @ApiOperation("增加一个表")
        public BaseResponse<String> addTable(@Validated @RequestBody Tables tables, BindingResult br) {
            if (br.hasErrors()) {
                String defaultMessage = br.getFieldError().getDefaultMessage();
                return BaseResultUtils.error(defaultMessage);
            } else {
                modelService.createTB(tables);
                return BaseResultUtils.success(null);
            }
        }

    五、最终效果

    参考:

    https://blog.csdn.net/qq_40775879/article/details/86302695

    https://www.jianshu.com/p/67d3637493c7

  • 相关阅读:
    局域网无法访问vmware虚拟机WEB服务器解决办法
    zipimport.ZipImportError: can't decompress data; zlib not available 解决办法
    如何在win下使用linux命令
    《redisphp中文参考手册》php版
    Python关键字参数与非关键字参数(可变参数)详解
    Python与 PHP使用递归建立多层目录函数
    第一场个人图论专题
    poj_2762,弱连通
    word宏的问题
    fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15007865.html
Copyright © 2011-2022 走看看