参数校验(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
相关配置,若自己已经在配置文件中有相关配置,则无需加入这个注解