--------------------------------------------------------
+----------------------------+
| HttpMessageConverter |
+--------------+---------+---+
| | +----------+
| +----|调用控制器|
| +----------+
| |
+---------------------|-----------------|------+
|webDataBinder | | |
| +------------------------------+ | |
| | |---------| |---------| | | |
| | |Converter| |Formatter| | | |
| | +---------| |---------+ | | |
| | |----------------| | | |
| | |GenericConverter| | | |
| | |----------------| | | |
| +---------------|--------------+ | |
| |------|----| +----------+ |
| | POJO |---------| 验证机制 | |
| |-----------| |----------| |
+----------------------------------------------+
--------------------------------------------------------
まず、インターフェース
UserValidatorを横断する際の方法をタグ付けパラメータの後には、springMVC対応するバリを横断し、そのサポートを実行します()。
自定义参数验证在WebDataBinder机制中。验证接口如下:
public interface Validator {
//判断是否支持该POJO验证
boolean supports(clazz)
//验证
void validate(Object target , Errors errors)
}
第二に、検証[クラス]を作成します
POJO
@Component
@Data
public class MyUser {
private Integer id;
private String name;
}
---検証クラスは、インターフェイスを実装UserValidator
/**
* 自定义user对象验证
* Validator: spring的验证接口
*/
@Component
public class UserVaildator implements Validator {
//如果是需要验证的类型,则返回true,继续验证
@Override
public boolean supports(Class<?> aClass) {
return aClass.equals(MyUser.class);
}
//自定义验证逻辑
@Override
public void validate(Object o, Errors errors) {
System.out.println("进行自定义数据验证");
if(o==null){
//直接返回错误信息,不进入controller方法
errors.rejectValue("",null,"参数不能为空");
return;
}
MyUser myuser= (MyUser) o;
if(StringUtils.isEmpty(myuser.getId())) errors.rejectValue("id",null,"id不能为空");
if(StringUtils.isEmpty(myuser.getName())) errors.rejectValue("id",null,"姓名不能为空");
//其他参数验证,最后结果统一放入errors,进入controller
}
}
第三に、[WebDataBinderに対する結合機構]
- コントローラはinitBinder(WebDataBinderバインダー)メソッドを加えました。
- @InitBinder:コメントのコントローラメソッドを実行する前に、WebDataBinderオブジェクトを取得します。
- バリデータをバインドするWebDataBinderオブジェクトです。
@Autowired
private UserVaildator userVaildator;
/**
* @InitBinder的方法会在controller方法执行之前执行
* 注册自定义的user验证器,当有实体需要验证时,springmvc会遍历所有的验证器
* 找到自定义注册的这个进行验证
* @param webDataBinder
*/
@InitBinder
public void initBinder(WebDataBinder webDataBinder){
webDataBinder.setValidator(userVaildator);//绑定验证器
}
第四に、結果が[]得@Valid
@GetMapping("/vaildMyUser")
public Map<String,Object> vaildMyUser(@Valid @RequestBody MyUser myuser, Errors errors){
Map<String,Object> result=new HashMap<>();
if(errors.hasErrors()){ //如果有错误
//获取验证结果
errors.getAllErrors().stream().forEach(x->{
String key=null;
if(x instanceof FieldError){ //字段错误
FieldError fe= (FieldError) x;
key=fe.getField();
}else{ //对象错误
key=x.getObjectName();
String defaultMessage = x.getDefaultMessage();
}
result.put(key,x.getDefaultMessage());
});
}else{
System.out.println("验证通过,继续执行业务逻辑");
result.put("0","成功");
}
return result;
}