2012-07-18 18 views
6

に親を取得しています:私は@ExceptionHandlerを持つ親クラスとそれ自身のバージョンを持つサブクラスを持っています。私はあいまいなメソッドエラー

@ExceptionHandler(NoUserException.class) 
protected ModelAndView handleException(NoUserException e) { 
    Map<String, Object> model = new HashMap<String, Object>(); 

    model.put(ModelKeys.HOST_KEY, "message"); 

    return new ModelAndView("noAccess",model); 
} 

子:

@ExceptionHandler(NoUserException.class) 
protected void handleException(NoUserException e, HttpServletRequest request, HttpServletResponse response) throws IOException { 
    logger.error("Invalid user."); 
    respond(CLIENT_USER_ERROR,response); 
} 

はい、私は異なるパラメータと出力を持っているためにそれらが必要です。

+0

どういう意味ですか?それは親クラスのいくつかのコードです...それは単なる新しいNoUserException()を投げるのです –

+0

それはisntですか?私はそれを実行するときに起こっている。どの方法を使うかは決めることができません。 –

+0

おそらく2つの '@ ExceptionHandler'が定義されているので、1つはスーパークラスから継承され、新しいものはサブクラスで定義されます。それを上書きする方法がわからない場合、メソッドに同じシグネチャがないため、自動的には発生しません。 – purtip31

答えて

8

同じ例外ハンドラで2つのメソッドを持つことはできません。申し訳ありませんが、サポートされていません。それらを解決するコードは、スーパーサブクラス間を識別せず、サブクラスを「より具体的」と考えます。興味があればコードはorg.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolverです。コントローラのメソッドを継承したメソッドよりも具体的な結果と考えているものに基づいて、AbstractHandlerExceptionResolverという独自の実装を行うことは難しくありません。

編集:個人的なコメント、私は、Spring MVCアノテーション駆動型のコントローラを作成するときに、「テンプレートツールとしての継承」を使用することを奨励していないことがわかりました。ビューコードは、本質的に頑丈で手続き的であるため、最初は別の「ビューレイヤー」を作成しています。 DRYと「再利用」に対する過度にミクロなアプローチはあなたをここでは役に立たない。それがリスコフ置換原理に違反するなら、私はそれをしません。もちろんYMMV。

1

handleException()の実装を別の方法に委任してみませんか?

// superclass 
protected ModelAndView handleExceptionImpl(
     NoUserException e, 
     HttpServletResponse response) { 
    Map<String, Object> model = new HashMap<String, Object>(); 
    model.put(ModelKeys.HOST_KEY, "message"); 
    return new ModelAndView("noAccess",model); 
} 

@ExceptionHandler(NoUserException.class) 
protected ModelAndView handleException(
     NoUserException e, 
     HttpServletResponse response) { 
    return handleExceptionImpl(e, response); 
} 

// subclass 
@Override 
protected ModelAndView handleExceptionImpl(
     NoUserException e, 
     HttpServletResponse response) { 
    logger.error("Invalid user."); 
    respond(CLIENT_USER_ERROR,response); 
} 
関連する問題