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

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 templateエンジンを使用しているので、ファイルを 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__によって自動的に取得されます** 。

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

リンク:/uploads/error1-300x105.png%20300w[]

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

3.1. カスタム ErrorController

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

これには、 ErrorController インターフェースを実装し、エラーが発生したときに呼び出すカスタムパスを返すためにその____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 ページが表示されます。

リンク:/uploads/error404-1024x178.png%201024w[]

4結論

この情報を基に、エラーをよりエレガントに処理し、ユーザーに美的なページを表示することができます。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot[over on Github]から入手可能です。