參數校驗(validation)
參數校驗一般通過Validator
實現,分爲全局校驗和局部校驗,通過一個簡單的例子說明:假設有一個用戶類User
,一個檢驗類UserValidator
,一個測試用的TestController
。本文在springboot2
的基礎上進行。
準備工作,3個java文件分別如下
User.java如下:
public class User {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
UserValidator如下:
public class UserValiduator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User)target;
//當年齡小於零時,校驗不通過
if(user.getAge()<0){
errors.rejectValue("age","age<0");
}
}
}
TestController如下:
@Controller
@RequestMapping("/test")
public class TestController{
@RequestMapping("/valid")
@ResponseBody
public String testValid(@Valid User user){
return "success";
}
}
那麼我們如何讓上面的用戶校驗生效呢
如果要將UserValidator
註冊爲全局驗證,即任何地方都可使用,需要添加一個配置文件,配置類實現WebMvcConfigure
,並複寫getValidator()
方法;
@Configuration
public class CommonConfig implements WebMvcConfigurer {
@Override
public Validator getValidator() {
return new UserValiduator();
}
}
如果要讓UserValidator
僅在TestController
中可用,則需要使用@InitBinder
在控制器中完成校驗器的註冊,如下:
@Controller
@RequestMapping("/test")
public class TestController{
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.addValidators(new UserValidator());
}
@RequestMapping("/valid")
@ResponseBody
public String testValid(@Valid User user){
return "success";
}
}
參數校驗測試
訪問 localhost/test/valid?name=zhangsan&age=10
結果返回:success
訪問 localhost/test/valid?name=zhangsan&age=-1
,結果報錯:Field error in object 'user' on field 'age': rejected value [-1]
需要注意的是:
- 被校驗的參數前需要加上
@Valid
註解才能生效,之前看過有些文章中沒有加也能生效,測試的時候必須要加才能生效- 官網的實例中配置類上還加入了@EnableWebMvc這個註解,加上這個註解會覆蓋自己的
application.yml
配置文件中的mvc
相關配置,若自己已經在配置文件中有相關配置,則無需加入這個註解