目录
一、需求
StringBoot开发POST接口使用HibernateValidator校验@RequestBody注解的参数时,需要对参数进行校验。使用快速失败返回模式(只要有一个验证失败,则返回)。需要控制校验字段的顺序。
二、实现方式
使用HibernateValidator的分组校验实现排序。
分组顺序校验时,按指定的分组先后顺序进行验证,前面的验证不通过,后面的分组就不行验证。
validate注解group属性不传时会调用默认的Default.class分组。
深入@Valid和@Validated的区别能更好的用不同的方法实现功能。(方案有很多种,实例只测试一种可行方案)
三、实例
新建一个普通的SpringBoot项目。
1增加配置文件使用快速失败模式
HibernateValidationConfig
package com.asyf.demo.config;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
@Configuration
public class HibernateValidationConfig {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
/**默认是普通模式,会返回所有的验证不通过信息集合*/
MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
/**设置validator模式为快速失败返回*/
processor.setValidator(validator());
return processor;
}
@Bean
public Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
.failFast(true)
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
return validator;
}
}
2创建测试实体类
User
package com.asyf.demo.controller;
import javax.validation.constraints.NotBlank;
public class User {
private String id;
@NotBlank(message = "name不能为空")
private String name;
@NotBlank(message = "password不能为空")
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3创建congtroller
DemoController
package com.asyf.demo.controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import java.util.Date;
@RestController(value = "/")
@Validated
public class DemoController {
@RequestMapping(value = "demo", method = RequestMethod.POST)
public String test(@Valid @RequestBody User user, BindingResult bindingResult) {
String str = new Date().toString();
return str;
}
}
4使用postman测试接口
结果不正确,应该优先验证name属性。
四、解决排序问题
1新增注解
package com.asyf.demo.annotation;
public interface Name {
}
package com.asyf.demo.annotation;
public interface Password {
}
package com.asyf.demo.annotation;
import javax.validation.GroupSequence;
@GroupSequence({Name.class, Password.class, Default.class})
public interface UserSequence {
}
注意:Default.class必须添加,否则id属性不会校验。(validate注解group属性不传时会调用默认的Default.class分组)