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

 

posted @ 2021-07-13 18:29  Mars.wang  阅读(2957)  评论(2编辑  收藏  举报