spring-mvc-boot-7 custom data validation

 

--------------------------------------------------------
       +----------------------------+
       |  HttpMessageConverter      |
       +--------------+---------+---+
                      |         |    +----------+
                      |         +----|调用控制器|
                      |              +----------+
                      |                 |
+---------------------|-----------------|------+
|webDataBinder        |                 |      |
|  +------------------------------+     |      |
|  | |---------|     |---------|  |     |      |
|  | |Converter|     |Formatter|  |     |      |
|  | +---------|     |---------+  |     |      |
|  |       |----------------|     |     |      |
|  |       |GenericConverter|     |     |      |
|  |       |----------------|     |     |      |
|  +---------------|--------------+     |      |
|           |------|----|         +----------+ |
|           |   POJO    |---------| 验证机制 | |
|           |-----------|         |----------| |
+----------------------------------------------+
--------------------------------------------------------

First, the interface
 after the parameters tagging method, springMVC will traverse the corresponding validator, when traversed UserValidator, executes its supports ().

自定义参数验证在WebDataBinder机制中。验证接口如下:

    public interface Validator {   

        //判断是否支持该POJO验证  
        boolean supports(clazz)

        //验证   
        void validate(Object target , Errors errors)
    }

Second, create a validation [class]

POJO

@Component
@Data
public class MyUser {

    private Integer id;

    private String name;

}

--- verification class implements the interface 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

    }
}

Third, the [binding mechanism to WebDataBinder] 

  •         The controller was added initBinder (WebDataBinder binder) method. 
  •         @InitBinder: Before executing the comment controller method, get WebDataBinder object.
  •         Binding validator is WebDataBinder object.

    @Autowired
    private UserVaildator userVaildator;

 

    /**
     * @InitBinder的方法会在controller方法执行之前执行
     *   注册自定义的user验证器,当有实体需要验证时,springmvc会遍历所有的验证器
     *   找到自定义注册的这个进行验证
     * @param webDataBinder
     */
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder){
        webDataBinder.setValidator(userVaildator);//绑定验证器
    }

Fourth, the results obtained [] @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;
    }

 

Guess you like

Origin blog.csdn.net/lidongliangzhicai/article/details/92432361