参考先摆在前面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 来进行验证,步骤分以下几个
- 创建一个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");
在 controller 中加入 Validator
1
2
3
4
5
6
7@Autowired
private SomeValidator someValidator;
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.setValidator(someValidator);
}最后在参数上添加@Valid接口
1
2
3
4@RequestMapping(value="/yourapi", method=RequestMethod.POST)
public ModelAndView createNewShop(@Valid Some some) {
//这里拿到的 some 对象就是已经是验证之后的了
}