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。
これが、カスタムエラーページを表示するために必要なすべてです。 いくつかのスタイルを設定すると、ユーザーにとってより見栄えの良いエラーページが表示されます。
使用したい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ページが表示されます。
4. 結論
この情報を使用して、エラーをよりエレガントに処理し、ユーザーに美しいページを表示できます。
いつものように、完全なソースコードはover on Githubで利用できます。