我的Controller
中有多个多种方法,每个方法都有ModelAttribute
个BindingResult
,例如
@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
检查放入类似Aspect
或Interceptor.
的内容。换句话说,我不想这样做检查每种方法:
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()]));
}
因此,不必在每种方法中检查都很好。