스프링 MVC 부팅-7 사용자 정의 데이터 유효성 검사

 

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

 

추천

출처blog.csdn.net/lidongliangzhicai/article/details/92432361