将BindingResult检查从Controller移动到Aspect或Interceptor

时间:2017-05-18 18:18:01

标签: java spring spring-mvc

我的Controller中有多个多种方法,每个方法都有ModelAttributeBindingResult,例如

@RequestMapping(value = "/somewhere", method = RequestMethod.POST)
@ResponseBody
public SomeDTO someMethod(@Valid SomeModel someModel, BindingResult bindingResult, HttpServletRequest request,
        HttpServletResponse response) {

    if (bindingResult.hasErrors()) {
        throw new InvalidRequestException("some error", bindingResult);
    }

    SomeDTO someDTO = someService.doSomething(someModel);

    return someDTO;
}

我想稍微干掉我的代码并将BindingResult检查放入类似AspectInterceptor.的内容。换句话说,我不想这样做检查每种方法:

if (bindingResult.hasErrors()) {
    throw new InvalidRequestException("some error", bindingResult);
}

@Controller上调用方法的任何时候我想检查BindingResult并且如果有错误,则抛出我的自定义InvalidRequestException。那样我的控制器就不需要检查了。

我最初的想法是有一个方面可以检查:

伪代码

@Before("@within(org.springframework.stereotype.Controller)")
public void myMethod( JoinPoint jp ) throws Throwable {

    Signature signature = jp.getSignature();
    Object [] args = jp.getArgs();

    for(Object arg : args){
        if(arg instanceof BindingResult){
            BindingResult br = (BindingResult) arg;
            if(br.hasErrors()){
                throw new InvalidRequestException("Error...", br);
            }
        }
    }
}

但我不确定这是不是一个好办法处理这个问题。有更简单的方法吗?或者Spring中的某些东西可以帮助做到这一点?

这背后的原因是我有一个提交两个不同ModelAttributes的表单。所以每个方法都有两个BindingResults,这使得检查更大一点,我实际上做了类似下面的事情:

if (br1.hasErrors() || br2.hasErrors()) {
    List<Errors> errors = new ArrayList<Errors>();

    if(br1.hasErrors()){
        errors.add(br1);
    }

    if(br2.hasErrors()){
        errors.add(br2);
    }

    throw new InvalidRequestException("Error...", errors.toArray(new Errors[errors.size()]));
}

因此,不必在每种方法中检查都很好。

0 个答案:

没有答案