利用Spring前置通知,捕捉controller方法调用之前的BindingResult类型参数,将参数校验异常提前抛出去。省去对controller内对BindingResult作检查,避免了代码污染。
@Aspect
@Configuration
public class ParamVeriyAspect {
@Before(value = PointCut.CONTRLLER_POINTCUT)
public void getVerifyException(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
if (null == args || args.length == 0) {
return;
}
for (Object object : args) {
if (object instanceof BindingResult) {
BindingResult br = (BindingResult) object;
if (br.hasErrors()) {
throw new ParamException(buildMessage(br));
}
}
}
}
private String buildMessage(BindingResult bindingResult) {
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
List<String> messages=DrinListUtils.list2list(fieldErrors,error->fieldError.getDefaultMessage());
return join(messages,",");
}
}
示例:
@RequestMapping("/list")
public JsonResult findAreas(@Validated AreaQueryPo po, BindingResult br) throws Exception {
//无须再对BindingResult进行处理
return service.findAreas(po);
}