想必大家都使用過validation框架,例如下圖
框架已經給我們提供了不少的校驗註解,那麼如果我們有時候針對特殊情況需要自定義校驗那麼需要怎麼做呢?
例如:我們在生成訂單號的時候會根據平臺的自有規則去生成,那麼在查詢訂單的時候我們可以自定義校驗來對這個傳遞的訂單號進行校驗
1:引入validationjar包
2:新建一個annotation
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
* 自定義驗證註解
*
* @author Daniel
*
*/
@Target({ElementType.METHOD, ElementType.FIELD}) //註解作用的地方,此處定位爲作用與方法和字段上
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyValidMethod.class) //指定來處理驗證的類
public @interface MyValid {
String message(); //這邊可以標註默認的驗證失敗消息
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
3:新建上面指定的處理類
package com.example.demo.validate;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.springframework.beans.factory.annotation.Autowired;
import com.example.demo.service.UserService;
/**
* @author Daniel
*
* 自定義的註解驗證方法
* 實現ConstraintValidator<T,T>
* 兩個泛型類型爲:
* 第一個:你自定義的註解
* 第二個:傳遞的值例如你定義在field字段上,那麼這個類型就是你定義註解的那個字段類型
* ConstraintValidator<MyValid, Object>
*
* 在這邊只要實現了ConstraintValidator<T,T>,那麼你的這個方法就會被spring容器納入管理
* 因此你就可以很方便的在這個驗證方法中注入spring管理的類去進行業務邏輯驗證
*
*/
public class MyValidMethod implements ConstraintValidator<MyValid, Object> {
@Autowired
private UserService userService;
/**
* 初始化方法
*
*/
@Override
public void initialize(MyValid constraintAnnotation) {
System.out.println("自定義驗證初始化");
}
/**
* 驗證方法
* 驗證成功返回: true
* 驗證失敗返回: false
*/
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
userService.sayHello(value.toString());
return false;
}
}
4:在需要驗證的字段上添加自定義的註解
5:新建controller方法
6:執行test測試,這邊把username傳遞爲空會出現校驗提示(這邊在校驗處理類中直接返回的false校驗不過,實際情況結合業務去處理)