Spring Boot:Whitelabelエラーページのカスタマイズ

Spring Boot:ホワイトラベルエラーページのカスタマイズ

1. 概要

この記事では、適切なエラー処理がプロ意識と質の高い作業を表すため、disable and customize the default error page for a Spring Boot applicationを実行する方法を見ていきます。

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

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

server.error.whitelabel.enabled=false

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

We can achieve the same result by excluding the 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 templateエンジンを使用しているため、We’ll save the file as error.html




Something went wrong!

Our Engineers are on it

Go Home

デフォルトのSpringBootのBasicErrorControllerによるIf we save this file in resources/templates directory, it’ll automatically be picked up

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

 

Spring Boot Custom Error Page

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

3.1. カスタムErrorController

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

このため、we have to create a class that implements the ErrorController interfaceとそのgetErrorPath() をオーバーライドして、エラーが発生したときに呼び出すカスタムパスを返します。

@Controller
public class MyErrorController implements ErrorController  {

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

    @Override
    public String getErrorPath() {
        return "/error";
    }
}

上記のスニペットでは、クラスに@Controllerアノテーションを付け、getErrorPath()によって返されるパスのマッピングも作成しています。 このようにして、コントローラーは/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ページが表示されます。

image

4. 結論

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

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