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

  • 相关阅读:
    【KM】BZOJ1937 [Shoi2004]Mst 最小生成树
    【动态规划+Floyd】OpenJudge3368
    【四边形不等式】HDU3506-Monkey Party
    【tarjan】BZOJ2140-稳定婚姻
    【并查集】BZOJ4668-冷战
    [ZJOI2010]贪吃的老鼠(网络流+建图)
    [NOI2010]航空管制(拓扑排序+贪心)
    [CERC2017]Intrinsic Interval(神仙+线段树)
    [CTSC2012]熟悉的文章(后缀自动机+动态规划)
    [CERC2014]Virus synthesis
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15007865.html
Copyright © 2011-2022 走看看