参考先摆在前面Reference

这两天写代码遇到一个问题:如果是直接通过 @RequestBody来创建一个 Java 对象的方式,虽然可以直接 map 一个 json 对象到 Java 对象。为了对该对象的参数做一些验证,但又不想自己来组装这个对象写成很长的一段参数列表 :

1
2
3
4
5
6
7
@RequestMapping(value="/yourapi", method=RequestMethod.POST)
public ModelAndView createNewShop(@RequestParam Value1 value1,
@RequestParam Value2 value2
//, ...长长的一串
) {

}

这时实现一些必要参数的验证,就可以用 Validator 来进行验证,步骤分以下几个

  1. 创建一个Validator 并实现其 validate 方法:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @Component
    public class SomeValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
    return Some.class.isAssignableFrom(clazz);
    //或写成 return Some.class.equals(clazz);

    }

    @Override
    public void validate(Object target, Errors errors) {
    //这里对 target 进行验证
    }

    }

在 validate 方法中,target 即json 转换成的 POJO,可强转为该对象 Some some = (Some)target;,可对其进行空判断、范围检查等验证:

  • ValidationUtils.rejectIfEmpty(errors, “name”, “message.name_cant_be_empty”);
  • some.getSomeValue(); 做一些验证 然后 errors.rejectValue("someValue","reason");
  1. 在 controller 中加入 Validator

    1
    2
    3
    4
    5
    6
    7
    @Autowired
    private SomeValidator someValidator;

    @InitBinder
    private void initBinder(WebDataBinder binder) {
    binder.setValidator(someValidator);
    }
  2. 最后在参数上添加@Valid接口

    1
    2
    3
    4
    @RequestMapping(value="/yourapi", method=RequestMethod.POST)
    public ModelAndView createNewShop(@Valid Some some) {
    //这里拿到的 some 对象就是已经是验证之后的了
    }