SpringBoot自定义校验注解校验日期时间格式字符串

  1. 先定义一个注解
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DateTimeStrValidator.class)
public @interface DateTimeStr {
 
    String message() default "format incorrect";
 
    String format() default "yyyy-MM-dd HH:mm:ss";
 
    Class<?>[] groups() default {};
 
    Class<? extends Payload>[] payload() default {};
}
  1. 编写校验类
package com.aerosatlink.serviceagent.config;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.text.SimpleDateFormat;

/**
 * 日期时间字符串校验器
 *
 * @author 杨君屹
 * @date 2021/08/05
 */
public class DateTimeStrValidator implements ConstraintValidator<DateTimeStr, String> {
    
    private DateTimeStr dateTimeStr;

    @Override
    public void initialize(DateTimeStr dateTimeStr) {
        this.dateTimeStr = dateTimeStr;
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 如果 value 为空则不进行格式验证,为空验证可以使用 @NotBlank @NotNull @NotEmpty 等注解来进行控制,职责分离
        if (value == null) {
            return true;
        }
        String format = dateTimeStr.format();

        if (value.length() != format.length()) {
            return false;
        }

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);

        try {
            simpleDateFormat.parse(value);
        } catch (Exception e){
            return false;
        }
        return true;
    }
}

  1. 在实体类上使用注解
    @DateTimeStr(message = "sessionBegin not satisfied with format yyyy-MM-dd HH:mm:ss ")
    private String sessionBegin;
  1. 在controller层接口位置使用@Valid注解,开启校验

你可能感兴趣的:(springboot)