Spring MVC提供了參數(shù)驗(yàn)證機(jī)制延旧,一方面可以支持JSR-303注解驗(yàn)證齿诞,在默認(rèn)的情況下Spring Boot會(huì)引入Hibernate Validator機(jī)制來(lái)支持JSR-303驗(yàn)證規(guī)范雨膨;另一方面谷饿,因?yàn)闃I(yè)務(wù)復(fù)雜娃胆,所以也支持自定義驗(yàn)證規(guī)則哩罪。
1.JSR-303驗(yàn)證
1.非空判斷
@NotNull(message = "id不能為空")
private Long id;
2.時(shí)間判斷
@Future(message = "需要一個(gè)將來(lái)日期")
//@Past(message = "需要一個(gè)過(guò)去日期")
@NotNull
private Date date;
3.范圍判斷
@NotNull
@DecimalMin(value = "0.1", message = "最小值0.1元")
@DecimalMax(value = "10000.00", message = "最大值10000元")
private Double value;
@NotNull
@Min(value = "1", message = "最小值為1")
@Max(value = "10", message = "最大致為10")
private Integer age;
@Range(min = 1, max = 99, message = "范圍為1至88")
private Long range;
4.郵箱驗(yàn)證
@Email(message = "郵箱格式錯(cuò)誤")
private String email;
5.長(zhǎng)度驗(yàn)證
@Size(min = 20, max = 30, message = "字符串長(zhǎng)度要求20到30質(zhì)檢")
private String size;
2.參數(shù)驗(yàn)證機(jī)制
為了更加靈活的提供驗(yàn)證機(jī)制,Spring還提供了自己的驗(yàn)證機(jī)制锁摔。在參數(shù)轉(zhuǎn)換時(shí)廓旬,可以看到在Spring MVC中在WebDataBinder機(jī)制進(jìn)行管理,在默認(rèn)情況下Spring會(huì)自動(dòng)地根據(jù)上下文通過(guò)注冊(cè)了的轉(zhuǎn)換器轉(zhuǎn)換出參數(shù)所需的參數(shù)谐腰。在WebDataBinder中除了可以注冊(cè)轉(zhuǎn)換器外孕豹,還允許注冊(cè)驗(yàn)證器(Validator)。
在Spring容器中怔蚌,它允許使用注解@InitBinder巩步,這個(gè)注解的作用允許在進(jìn)入控制器方法錢(qián)修改WebDataBinder機(jī)制。Spring MVC驗(yàn)證接口
package org.springframework.validation;
public interface Validator {
/** 判定當(dāng)前驗(yàn)證器是否支持該Class類(lèi)型的驗(yàn)證 */
boolean supports(Class<?> clazz);
/** 如果supports返回true桦踊,則這個(gè)方法執(zhí)行驗(yàn)證結(jié)果 */
void validate(Object target, Errors errors);
}
這是Spring所定義的驗(yàn)證接口椅野,他定義了兩個(gè)方法,其中supports方法參數(shù)為需要驗(yàn)證的POJO類(lèi)型籍胯,如果該方法返回true竟闪,則spring會(huì)使用當(dāng)前驗(yàn)證器的validate方法區(qū)驗(yàn)證POJO。而validate方法包含需要的target對(duì)象和錯(cuò)誤對(duì)象errors杖狼,其中target是參數(shù)綁定后的POJO炼蛤,這樣便可以通過(guò)這個(gè)參數(shù)對(duì)象進(jìn)行業(yè)務(wù)邏輯的自定義驗(yàn)證。如果發(fā)現(xiàn)錯(cuò)誤蝶涩,則可以保存到errors對(duì)象中理朋,然后返回給控制器。
public class UserValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return clazz.equals(User.class);
}
@Override
public void validate(Object taget, Errors errors) {
// 對(duì)象為空
if (taget == null) {
// 直接在報(bào)錯(cuò)參數(shù)處報(bào)錯(cuò)绿聘, 這樣就不能進(jìn)入控制器了
errors.rejectValue("", "用戶(hù)不能為空");
}
// 強(qiáng)制轉(zhuǎn)換
User user = (User) target;
// 用戶(hù)名非空串
if (StringUtils.isBlank(user.getUserName())) {
errors.rejectValue("userName", null, "用戶(hù)名不能為空");
}
}
}
有了這個(gè)驗(yàn)證器嗽上,Spring還不會(huì)自動(dòng)啟動(dòng)它,因?yàn)檫€沒(méi)有綁定WebDataBinder機(jī)制熄攘。在Spring MVC中提供了一個(gè)注解@InitBinder兽愤,他的作用是在執(zhí)行控制器方法前,處理器會(huì)先執(zhí)行被@InitBinder標(biāo)注的方法挪圾。這時(shí)可以將WebDataBinder對(duì)象作為參數(shù)傳遞到方法中浅萧,通過(guò)這層關(guān)系得到WebDataBinder對(duì)象,這個(gè)對(duì)象有一個(gè)setValidator方法哲思,他可以綁定自定義的驗(yàn)證器洼畅,這樣就可以在獲取參數(shù)后,通過(guò)自定義驗(yàn)證器去驗(yàn)證參數(shù)棚赔。綁定驗(yàn)證器代碼清單如下:
@RestController
@RequestMapping("/user")
public class UserController {
@InitBinder
public void initBinder(WebDataBinder binder) {
// 綁定驗(yàn)證器
binder.setValidator(new UserValidator());
}
}