代码之家  ›  专栏  ›  技术社区  ›  lisak

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

  •  3
  • lisak  · 技术社区  · 14 年前

    我开发了一个Web应用程序,其中表单验证异常应该由@异常处理程序(需要灵活)和SimpleMappingExceptionResolver的一般系统异常(如电子邮件通知之类的东西来处理)。

    问题是,如果我同时使用这两种方法,则映射到@ExceptionHandler的异常不会到达@ExceptionHandler,而是作为defaultError被ExceptionResolver捕获。

    知道怎么做才能让它一起工作吗?

    @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 回复  |  直到 5 年前
        1
  •  2
  •   heikkim    14 年前

    也许作为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..
    }
    

    这不是一个很好的解决方案,但应该有效。。

        2
  •  2
  •   Ihor Kaharlichenko    13 年前

    只要您将至少一个异常解决程序放入应用程序上下文DispatcherServlet,就会停止实例化默认的异常解决程序( 注释MethodHandlerExceptionResolver 在你的情况下)。

    一定要两个都放 注释MethodHandlerExceptionResolver SimpleMappingExceptionResolver 应用程序上下文,并强制其排序。

    my post 详细解释。

        3
  •  0
  •   axtavt    14 年前

    我不熟悉Portlet环境,但是您可能需要声明 AnnotationMethodHandlerExceptionResolver 也。