1. 程式人生 > >SpringBoot中如何自定義自己的Valid註解

SpringBoot中如何自定義自己的Valid註解

在專案的開發中,在後臺介面中,我們經常需要對前端傳來的資料進行校驗,一般都是使用@Valid註解,但是有的時候我們的校驗工作比較複雜,@Valid提供的註解無法滿足我們的需求,這個時候我們就需要自己來定義我們自己所需的Valid註解。有同學不清楚@Valid註解的可以看一下我的另一篇文章Spring的資料校驗

首先我們來定義一個介面來實現我們的@Valid註解

@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {

	String message() ;

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

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

其中:@Target —— 表示這個註解可以作用在什麼地方,例如作用在方法上,或作用在某個欄位上。

           @Retention —— 被它所註解的註解保留多久,runtime表示不僅被儲存到class檔案中,jvm載入class檔案之後,仍然存在

           @Constraint —— 表示我們判斷邏輯的具體實現類是什麼。

再來定義我們的具體實現類的程式碼:

public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> {

	
	@Override
	public void initialize(MyConstraint constraintAnnotation) {
		System.out.println("my validator init");
		
	}

	@Override
	public boolean isValid(Object value, ConstraintValidatorContext context) {
       String name = (String)value;
		if ("tom".equals(name)) {
			return true;
		}
		System.out.println(value);
		return false;
	}

}

其中實現的ConstraintValidator介面中的兩個引數,第一個引數就我們定義的介面,第二個引數表示這個註解作用在什麼型別的欄位上,比如:我們這個定義的註解是隻作用在String型別時,可以將Object改成String。

現在就可以將我們自定義的註解作用在我們需要校驗的欄位上了

public class User {


	
	@MyConstraint(message = "這是一次測試")
	private String username;
	

	private String password;
	

	
    public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	
	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}


	
	
	
}

編寫我們的Controller進行資料接收

@RestController
@RequestMapping("/user")
public class UserController {
	
	
	
	@PostMapping
	public void create(@Valid @RequestBody User user,BindingResult errors) {
		
		if (errors.hasErrors()) {
			errors.getAllErrors().stream().forEach(error ->     System.out.println(error.getDefaultMessage()));
			
		}
		
	}

當我們傳入username為tom時,控制檯不列印資訊,當username不是tom時,控制檯打印出message中的資訊,即“這是一次測試”。