2010-11-23 68 views
3

我開發了一個Web應用程序,其中表單驗證異常應該由@ExceptionHandler(需要靈活)和SimpleMappingExceptionResolver處理一般系統異常如電子郵件通知等)。Spring異常處理 - 如何同時使用ExceptionResolver和@ExceptionHandler

問題是,如果我同時使用,爲@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環境,通常通過參數驅動的「視圖」更少......

回答

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.. 
} 

這不完全是一個完美的解決方案,而應工作..

+0

嗨heikkim,這正是我最終完成的,我沒有調用處理程序的方法,但我只是檢查這個(exc instanceof ValidatorException),我做了我所需要的。但是,你的建議更有意義,當邏輯處於處理程序時,它更加透明,而不是exceptionResolver – lisak 2010-11-25 14:14:07

0

我對Portlet環境不熟悉,但也許您還需要聲明AnnotationMethodHandlerExceptionResolver

+0

嗨,這沒有幫助,默認情況下AnnotationMethodHandlerExceptionResolver在上下文 – lisak 2010-11-25 14:08:53

2

只要你把至少一個異常解析器的應用程序上下文的DispatcherServlet停止實例默認的(AnnotationMethodHandlerExceptionResolver你的情況)。

請務必將兩個AnnotationMethodHandlerExceptionResolver的SimpleMappingExceptionResolver到應用程序上下文,並處他們的排序。

查看my post的詳細解釋。

+0

非常感謝! :-) – Kimble 2011-08-31 06:32:58