0

すべての404エラーを処理し、正しいページにスマートにリダイレクトするコントローラ(または他のコンポーネント)が必要です(これはテーブルsrc/targetに基づいています)。私は次のことを行ったので、私は、コントローラからスローされた例外処理に関するいくつかの質問を発見した:SpringブートWebアプリケーション - リダイレクトコントローラ

    @ControllerAdvice 
    public class ServiceExceptionHandler extends ResponseEntityExceptionHandler { 
    
        @ExceptionHandler(Throwable.class) 
        @ResponseBody 
        ResponseEntity<String> handleControllerException(HttpServletRequest req, Throwable ex) { 
    
         String slug = req.getRequestURI(); // this is the URL that was not found 
         URI location=null; 
         try { 
          // lookup based on slug ... 
          location = new URI("http://cnn.com"); // let's say I want to redirect to cnn 
         } catch (URISyntaxException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
         HttpHeaders responseHeaders = new HttpHeaders(); 
         responseHeaders.setLocation(location); 
         return new ResponseEntity<String>("Page has permanently moved", responseHeaders, HttpStatus.PERMANENT_REDIRECT); 
    
    
        } 
    } 
    

    私は、他の設定を行っていないこれで

    二つの問題がある変更

  • これは、他のコントローラが投げた例外だけを捕捉し、404エラーではない
  • これは、すべてのタイプの例外を捕捉します。404

"キャッチオール"のようなものを実装する方法に関するアイデアはありますか?

+0

http://stackoverflow.com/questions/28902374/spring-boot-rest-service-exception-handling –

答えて

0

これはおそらく最良のSpringブートソリューションではありませんが、似たような考え方を外挿してアプリケーションに適用することもできます。私はSpring 3.xで作業するときも同様の問題がありました。ここで私が思いついた解決策があります。

私のシナリオでは、同じアプリケーションコンテキストで複数のサーブレットを実行していました。そのうちの1つはWebインターフェイスを処理し、もう1つはAPI呼び出しを処理しました。私はサーブレットがUIサーブレットとは違って404を扱うAPI呼び出しを処理したかったのです。

DispatcherServletを拡張した新しいクラスを作成し、noHandlerFoundメソッドをオーバーライドしました。私は以前に持っていたデフォルトのDispatcherServletクラスの代わりに<servlet>タグのweb.xmlに新しいクラスを結びました。

<servlet> 
    <servlet-name>api-servlet</servlet-name> 
    <servlet-class>path.to.your.new.DispatcherServletClass</servlet-class> 
    ... 
</servlet> 
+0

これは、 "起動" 方法ではありません。あなたのコードは単なるサーブレットの定義です。私はそれを修正しなければ投票しません。 – checklist

関連する問題