--------------------------------------------------------
+----------------------------+
| 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;
}