8

親:

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

はい、異なるパラメーターと出力が必要です。

4

2 に答える 2

12

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

編集: 個人的なコメントです。Spring MVC アノテーション駆動型コントローラーを作成するときに、「テンプレート ツールとしての継承」を使用する衝動を抑える方が良いことがわかりました。ビュー コードは本質的に扱いにくく、手続き的な場合があります。これが、最初に別の「ビュー レイヤー」を作成する理由です。DRY と「再利用」に対する過度にミクロなアプローチは、ここでは役に立ちません。Liskov Substitution Principleに違反する場合は、私はしません。もちろんYMMV。

于 2012-07-18T16:58:42.507 に答える