10

私の問題は、未処理の例外をすべてキャプチャする @ExceptionHandler メソッドを作成したいということです。キャプチャしたら、エラーを表示するためだけに別のページを指定するのではなく、現在のページにリダイレクトしたいと思います。

基本的に、somemethod によって返される someview の値を取得し、以下のメソッド unhandledExceptionHandler で動的に設定するにはどうすれよいですか。

@ExceptionHandler(Exception.class)
protected ModelAndView unhandledExceptionHandler(Exception ex){
    System.out.println("unhandle exception here!!!");
    ModelAndView mv = new ModelAndView();
    mv.setViewName("currentview");
    mv.addObject("UNHANDLED_ERROR", "UNHANDLED ERROR. PLEASE CONTACT SUPPORT. "+ex.getMessage());
    return mv;
}



@RequestMapping(value = "/somepage", method = RequestMethod.GET)
public String somemethod(HttpSession session) throws Exception {
    String abc = null;
    abc.length();
    return "someview";
}

したがって、JSP では、このエラー メッセージを現在のページに戻すことができます。

<c:if test="${not empty UNHANDLED_ERROR}">
    <div class="messageError"> ${UNHANDLED_ERROR}</div>
</c:if>
4

5 に答える 5

6

例外ハンドラーメソッドでは、ハンドラーメソッドが返す unhandledExceptionHandlerビューの名前を見つける方法がないため、あなたが求めていることを行う方法はないと思います。somemethod

唯一の方法は、ある種のメタ データ スキームを導入して、例外ハンドラーにたどり着いたときに、それをどのビューにマップするかを判断できるようにすることです。しかし、このメタデータ スキームはかなり複雑になると思います。例外がスローされたときにアクセスされていた元の URL を見つけることで、このようなスキームを実装できます。これは、以下のコード スニペットで実行できます。

(ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()

リダイレクトできる元のリクエスト URL がわかったら、おそらく flash 属性を使用して、例外が発生したという事実とエラーの内容を保存します。

メタデータの主な問題は、さまざまなビューを選択するハンドラー メソッドがある場合に発生します。

@RequestMapping(value = "/somepage", method = RequestMethod.GET)
public String somemethod(HttpSession session) throws Exception {
    String abc = null;
    if(someCondition) {
        abc.length();
        return "someview";
    } else {
        // do some stuff here.
        return "someOtherView";
    }
}

なんらかのメソッドがエラーの原因であることがわかっていても、if ステートメントのどのブランチが例外を引き起こしたのかはわかりません。

于 2013-09-16T16:49:32.547 に答える
2

別のページでエラーを送信するのではなく、エラーを ModelAndView オブジェクトに入れることができます。あなたの場合、コントローラメソッドに try/catch を入れるだけで、次のように同じビューを返すことができます:

@RequestMapping(value = "/somepage", method = RequestMethod.GET)
public String somemethod(ModelAndView mv,HttpSession session) throws Exception {
   mv.setViewName("someview");
   try{ 
      String abc = null;
      abc.length();
    } catch(Exception e) {
      mv.addObject("UNHANDLED_ERROR", "UNHANDLED ERROR. PLEASE CONTACT SUPPORT.  "+ex.getMessage());
   }
   return mv;
}

そのため、ModelAndView をメソッドに追加して返します。

于 2013-09-21T11:30:33.097 に答える
2

私はこれを試していませんが、ドキュメントhereに基づいて、例外ハンドラーでリクエスト オブジェクトを取得できます。URL にリンクされたビューを取得できない場合があります。URL からビューを取得し、ビューの状態/モデルを取得するのは難しい部分です。

  @ExceptionHandler(Exception.class)
  public ModelAndView handleError(HttpServletRequest req, Exception ex) {
    logger.error("Request: " + req.getRequestURL() + " raised " + ex);

    ModelAndView mav = new ModelAndView();
    mav.addObject("exception", ex);
    mav.addObject("url", req.getRequestURL());
    mav.setViewName("error");
    return mav;
  }
于 2017-06-30T20:11:38.213 に答える