版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mytt_10566/article/details/80844202
SpringBoot中添加spring-boot-starter-web依赖即会自动引用依赖的Hibernate validator,所以无需再手动添加依赖。
我们一般在Controller层校验参数,校验分为两种:封装的Bean、方法参数简单验证。
一、校验Bean
1.定义Bean
public class UserRegisterParam {
@NotBlank(message = "用户名不能为空")
private String name;
@Range(min = 1, max = 200, message = "年龄范围应该在1-200内")
private Integer age;
@NotEmpty(message = "密码不能为空")
@Length(min = 6, max = 8, message = "密码长度为6-8位")
@Pattern(regexp = "[a-zA-Z]*", message = "密码只能是字母")
private String password;
get、set略
}
2.Controller
使用@Valid注解标识需要验证的Bean,@Valid和BindingResult一一对应;如果有多个@Valid,那么每个@Valid后面跟着的BindingResult就是对应@Valid的验证结果。
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/api/register")
public String register(@Valid UserRegisterParam param, BindingResult result) throws Exception {
StringBuilder sBuilder = new StringBuilder();
if (result.hasErrors()) {
List<ObjectError> list = result.getAllErrors();
for (ObjectError error : list) {
sBuilder.append(error.getDefaultMessage()).append("\n");
}
} else {
sBuilder.append("success");
}
return sBuilder.toString();
}
}
二、校验方法参数
1.添加MethodValidationPostProcessor的Bean
@Configuration
public class ValidatorConfig {
// 配置方法参数校验
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
}
2.Controller
在Controller类上添加@Validated注解,在方法参数上直接添加校验规则注解,对于Bean校验,仍然使用@Valid注解。校验失败后,不管是参数校验、Bean校验,统一抛出ConstraintViolationException异常。
@Validated
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/api/login")
public String login(
@Length(min = 6, message = "账号长度至少6位") @RequestParam String account,
@Length(min = 6, max = 8, message = "密码长度6-8位") @RequestParam String password) throws Exception {
return "login success";
}
}
3.统一异常处理
对校验抛出的异常ConstraintViolationException进行捕获
@ControllerAdvice
@Component
public class GlobalExceptionHandler {
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public @ResponseBody String handle(ConstraintViolationException exception) {
Set<ConstraintViolation<?>> violations = exception.getConstraintViolations();
StringBuilder sBuilder = new StringBuilder();
for (ConstraintViolation<?> violation : violations) {
sBuilder.append(violation.getMessage() + "\n");
}
return sBuilder.toString();
}
}
三、校验模式
Hibernate Validator有两种校验模式:
- 普通模式(默认):交验完所有属性,返回验证失败的信息
- 快速失败返回模式:只要有一个验证失败则立即返回
1.配置
@Bean
public Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
.failFast(true)// true:快速失败返回模式 false:普通模式
.buildValidatorFactory();
}
或
@Bean
public Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
.addProperty("hibernate.validator.fail_fast", "true")// true:快速失败返回模式 false:普通模式
.buildValidatorFactory();
}
2.方法参数校验中使用快速失败返回模式
对MethodValidationPostProcessor设置Validator(此时不是用的Validator校验,所以只配置Validator不起作用),修改ValidatorConfig如下:
@Configuration
public class ValidatorConfig {
// 配置方法参数校验
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
// 设置validator模式为快速失败返回
postProcessor.setValidator(validator());
return postProcessor;
}
// 配置hibernate Validator为快速失败返回模式
@Bean
public Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
.failFast(true)// true:快速失败返回模式 false:普通模式
.buildValidatorFactory();
}
}
参考:https://www.cnblogs.com/mr-yang-localhost/p/7812038.html
http://www.cnblogs.com/bianzy/p/6639799.html