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

  • 相关阅读:
    PS总结
    有用的官方API和官网
    获取jQuery DataTables 的checked选中行
    jQuery DataTables 问题:Cannot reinitialise DataTable
    jQuery DataTables 分页
    实现页面跳转和重定向的几种方法
    iframe父页面和子页面高度自适应
    双核浏览器默认选择内核渲染自己开发的网页
    使用母版页的子页面无法显示母版页图片
    gdb安装
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15007865.html
Copyright © 2011-2022 走看看