1. 程式人生 > 程式設計 >Java Validation方法入參校驗實現過程解析

Java Validation方法入參校驗實現過程解析

一.前言

在日常的開發中,經常需要對方法引數進行校驗(非空、長度等)。如果採用hardcode去校驗(if..else..),會造成程式碼冗餘,複用性低,導致維護成本比較高。藉助Validation元件,可以很方便地通過註解來校驗引數。

二.Java Validation元件

JSR

JSR 是一種規範標準,規定了一些校驗規範的註解,位於javax.validation.constraints包下,只提供規範不提供實現,如@NotNull,@Size 等

Hibernate Validation

hibernate Validation 與 hibernate ORM框架沒有半毛錢關係,它提供了JSR的實現,位於org.hibernate.validator.constraints包下。

三.用法

引入依賴:

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>

手動新增bean :

對實體類添加註解:

@Data
publicclassPeople {
	@NotNull(message = "姓名不能為空")
	privateStringname;
	@Min(value = 1,message = "年齡不能小於1歲")
	privateInteger size;
}

Controller層上用法:

如果在Spring的Controller層引用以上Java Bean物件,則需要加上@Valid註解,用法如下:

@RestController
@RequestMapping("/api")
publicclassPeopleController {
	@Autowired
	privatePeopleService peopleService;
	@RequestMapping("/addPeople")
	publicStringaddPeople(@Valid@RequestBodyPeople people) {
		peopleService.addPeople(people);
		return"ok";
	}
}

Service層上用法:

@Valid註解,當我們用Service介面層的時候,會發現引數校驗邏輯是不生效的。要向讓@Valid註解在controller層以外的地方生效,必須配合@Validated來使用。這是因為Spring給我們建立了一個用於引數校驗的AOP切面邏輯,過濾方式就是class被@Validated修飾的bean物件。所以我們可以使用@Validated來修飾我們的service層實現類:

@Validated
 public interface PeopleService {
 voidaddPeople(@ValidPeople people);
}


Controller層不需要@Validated註解是因為在Spring的controller層有資料繫結和校驗的過程,預設就會對@Valid修飾的方法引數使用Validator來做校驗邏輯。

四.原理

1.利用Spring ioc,注入MethodValidationPostProcessor和LocalValidatorFactoryBean。

2.利用Spring ioc提供的擴充套件點(BeanPostProcessor, InitializingBean),初始化攔截器MethodValidationInterceptor

3.MethodValidationPostProcessor用來生成和植入攔截器MethodValidationInterceptor,呼叫方法時自動攔截。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。