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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM