SpringBoot自定義校驗注解校驗日期時間格式字符串


1 概述

后台單獨對接收到的參數進行驗證時比較麻煩,springboot項目的web組件(spring-boot-starter-web)集成了hibernate-validator,開發者可以直接使用hibernate-validator提供的注解對數據進行校驗,當有一些復雜的參數校驗時我們也可以自定義校驗注解

2、先定義一個注解

package com.ideatech.ams.ws.validate;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = DateTimeValidator.class)
public @interface DateTimeStr {

    String message() default "{javax.validation.constraints.DateTimeStr.message}";


    String format() default "yyyy-MM-dd HH:mm:ss";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

   @Constraint,指定校驗類
    message,失敗提示信息
    groups,分組驗證(后面介紹)
    payload,不知道,歡迎留言探討

2、編寫校驗類

package com.ideatech.ams.ws.validate;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;
import java.text.SimpleDateFormat;

public class DateTimeValidator 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:必須實現ConstraintValidator接口

2:實現了ConstraintValidator接口后即使不進行Bean配置,spring也會將這個類進行Bean管理

3:可以在實現了ConstraintValidator接口的類中依賴注入其它Bean

4:實現了ConstraintValidator接口后必須重寫 initialize 和 isValid 這兩個方法;initialize方法主要來進行初始化,通常用來獲取自定義注解的屬性值;isValid 方法主要進行校驗邏輯,返回true表示校驗通過,返回false表示校驗失敗,通常根據注解屬性值和實體類屬性值進行校驗判斷

    /**
     * 銀行通知客戶臨櫃時間(必填)
     */
    @NotBlank(message="銀行通知客戶臨櫃時間不能為空")
    @DateTimeStr(format ="yyyy-MM-dd HH:mm:ss", message = "格式錯誤,正確格式為:yyyy-MM-dd HH:mm:ss")
    private String bankApplyTime;

 


免責聲明!

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



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