我开发了一个Web应用程序,其中表单验证异常应由@ExceptionHandler处理(需要灵活)和SimpleMappingExceptionResolver处理常规系统异常(执行电子邮件通知等操作)。
问题是,如果我同时使用它们,那么为@ExceptionHandler映射的异常不会到达@ExceptionHandler,而是被ExceptionResolver抓取为defaultError。
知道如何让它一起工作吗?
@ExceptionHandler(ValidatorException.class)
public String handleFormException(ValidatorException ex, ActionRequest actionRequest) {
logger.error(ex.getMessage());
//TODO make conditions
return "mainOrderForm";
}
@ActionMapping(params = "action=addDocOrder")
public void addDocOrder(@ModelAttribute("order") CstOrderBeanImpl orderBean,
BindingResult result, ActionRequest actionRequest, ActionResponse response)
throws PortalException, SystemException, ValidatorException {
logger.info("Adding Form Order");
Calendar cal = TimeUtils.getEuDeadLine(orderBean);
orderBean.setDeadLine(cal.getTime());
ValidatorException ve = validateService.validate(orderBean, result, actionRequest, validator);
if (ve != null) throw ve;
(...)
在DispatcherPortlet中,有
catch (Exception ex) {
// Trigger after-completion for thrown exception.
triggerAfterActionCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);
(...)
哪个检查拦截器,但都不存在,所以它执行默认...
我只是指出,它是Portlet环境,通常会有较少的“视图”......由参数驱动..
答案 0 :(得分:2)
也许作为ExceptionResolver中的变通方法,您可以动态调用您选择的处理程序方法。
public ModelAndView resolveException(RenderRequest req, RenderResponse res, Object handler,Exception exc) {
if(exc instanceof ValidatorException) {
try {
java.lang.reflect.Method m = handler.getClass().getMethod("someMethod", (Class<?>)null /* method parameters? */);
m.invoke(handler,new Object[]{(ValidatorException)exc,req/*, res - maybe?*/});
} catch(Exception e) {
// Handle exception
}
}
// Send email of the error etc..
}
这不是一个优雅的解决方案,但应该有效..
答案 1 :(得分:2)
只要将至少一个异常解析器放入app-context,DispatcherServlet就会停止实例化默认解析器( AnnotationMethodHandlerExceptionResolver )。
请务必将 AnnotationMethodHandlerExceptionResolver 和 SimpleMappingExceptionResolver 添加到app-context中,并强加其排序。
有关详细说明,请参阅my post。
答案 2 :(得分:0)
我不熟悉Portlet环境,但也许你需要声明AnnotationMethodHandlerExceptionResolver
。