1. 概要

この記事では、を無効にしてSpring Bootアプリケーションのデフォルトのエラーページをカスタマイズする方法を見ていきます。適切なエラー処理はプロ意識と質の高い作業を表しています。

2. ホワイトラベルエラーページの無効化

まず、 server.error.whitelabel.enabledプロパティをfalse:に設定して、ホワイトラベルエラーページを完全に無効にする方法を見てみましょう。

server.error.whitelabel.enabled=false

このエントリをapplication.propertiesファイルに追加すると、エラーページが無効になり、Tomcatなどの基盤となるアプリケーションコンテナに由来する簡潔なページが表示されます。

ErrorMvcAutoConfiguration Beanを除外しても同じ結果を得ることができます。これを行うには、次のエントリをプロパティファイルに追加します。

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration

#for Spring Boot 2.0
#spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

または、このアノテーションをメインクラスに追加します。

@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})

上記のすべての方法で、ホワイトラベルエラーページが無効になります。 それでは、誰が実際にエラーを処理するのかという疑問が残ります。

さて、上記のように、それは通常、基盤となるアプリケーションコンテナです。 良い点は、すべてのデフォルトの代わりにカスタムエラーページを表示することで、さらにカスタマイズできることです。これが次のセクションの焦点です。

3. カスタムエラーページの表示

まず、カスタムHTMLエラーページを作成する必要があります。

Thymeleaf テンプレートエンジンを使用しているため、ファイルをerror.htmlとして保存します。

<!DOCTYPE html>
<html>
<body>
<h1>Something went wrong! </h1>
<h2>Our Engineers are on it</h2>
<a href="/">Go Home</a>
</body>
</html>

このファイルをresources/templatesディレクトリに保存すると、デフォルトのSpring BootのBasicErrorControllerによって自動的にが取得されます。

カスタムエラーページを表示するために必要なのはこれだけです。 いくつかのスタイリングにより、ユーザーにとってより見栄えの良いエラーページが表示されます。

 

使用したいHTTPステータスコードでファイルに名前を付けることで、より具体的にすることができます。 ファイルをresources/ templates / error404.html として保存すると、404エラーに対して明示的に使用されます。

3.1. カスタムErrorController

これまでの制限は、エラーが発生したときにカスタムロジックを実行できないことです。 これを実現するには、デフォルトのエラーコントローラーbeanを作成する必要があります。

このために、 ErrorControllerインターフェイスを実装するクラスを作成する必要があります。さらに、 server.error.path プロパティを設定して、エラー時に呼び出すカスタムパスを返す必要があります。発生した

@Controller
public class MyErrorController implements ErrorController  {

    @RequestMapping("/error")
    public String handleError() {
        //do something like logging
        return "error";
    }
}

上記のスニペットでは、クラスに @Controller のアノテーションを付け、プロパティ server.error.path:として指定されたパスのマッピングを作成します。

server.error.path=/error

このようにして、コントローラーは /errorパスへの呼び出しを処理できます。

handleError()で、前に作成したカスタムエラーページを返します。 ここで404エラーをトリガーすると、表示されるのはカスタムページです。

handleError()をさらに拡張して、さまざまなエラータイプの特定のエラーページを表示してみましょう。

たとえば、404および500エラータイプ専用に適切に設計されたページを作成できます。 次に、エラーのHTTPステータスコードを使用して、表示する適切なエラーページを決定できます。

@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
    Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
    
    if (status != null) {
        Integer statusCode = Integer.valueOf(status.toString());
    
        if(statusCode == HttpStatus.NOT_FOUND.value()) {
            return "error-404";
        }
        else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
            return "error-500";
        }
    }
    return "error";
}

次に、たとえば404エラーの場合、error-404.htmlページが表示されます。

4. 結論

この情報を使用して、エラーをよりエレガントに処理し、ユーザーに美的なページを表示できるようになりました。

いつものように、完全なソースコードはGithub利用できます。