2010-11-23 17 views
3

フォーム検証の例外が@ExceptionHandler(柔軟性が必要)とSimpleMappingExceptionResolverの一般的なシステム例外によって処理されるWebアプリケーションを開発しました電子メール通知など)。Spring例外処理 - ExceptionResolverと@ExceptionHandlerを同時に使用する方法

両方とも使用すると、@ExceptionHandlerにマップされた例外は@ExceptionHandlerには到達しませんが、ExceptionResolverではdefaultErrorとして取得されます。

一緒に働かせるにはどうすればいいですか? DispatcherPortletで

@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; 

、インターセプタをチェックしますが、何も存在しないので、それはデフォルトを行い

catch (Exception ex) { 
      // Trigger after-completion for thrown exception. 
      triggerAfterActionCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex); 

は...あり

私はちょうど指摘ポートレット環境であることは、通常はビューが少ないことです。パラメータによって駆動されます。

答えて

2

おそらくExceptionResolverの回避策として、あなたが選んだハンドラメソッドを動的に呼び出すことができます。すぐにデフォルトのものをインスタンスを停止しDispatcherServletのアプリ-コンテキストに少なくとも一つの例外リゾルバを置くよう

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、これは私が最後にやったことです、私はハンドラでメソッドを呼び出さなかったが、 instanceof ValidatorException)、私は必要なことをしました。しかし、あなたが示唆しているのは、ロジックがハンドラにあるときには、例外ではなく、もっと透明であることです。Resolver – lisak

0

私はポートレット環境に精通していませんが、おそらくAnnotationMethodHandlerExceptionResolverも宣言する必要があります。

+0

こんにちは、AnnotationMethodHandlerExceptionResolverはデフォルトでコンテキストにあります – lisak

2

(あなたのケースでAnnotationMethodHandlerExceptionResolver )。

アプリ-コンテキストにAnnotationMethodHandlerExceptionResolverSimpleMappingExceptionResolverの両方を入れて、また彼らの順序を課すようにしてください。

詳細な説明はmy postを参照してください。

+0

ありがとう! :-) – Kimble

関連する問題