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();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        try {
            simpleDateFormat.parse(s);
        } catch (Exception e) {
            return false;
        }
        return true;
    }
}

三、自定义注解的应用

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);
        }
    }

五、最终效果

springboot数据格式验证(二)——自定义日期格式验证

 

上一篇:关于pymysql.err.OperationalError: (1045, “Access denied for user ‘root‘@‘localho 问题个人的一些处理的方式


下一篇:springmvc时间date转换器(处理多种时间格式)