Spring异常处理 - 如何同时使用ExceptionResolver和@ExceptionHandler

时间:2010-11-23 00:49:41

标签: spring exception portlet

我开发了一个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环境,通常会有较少的“视图”......由参数驱动..

3 个答案:

答案 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