Spring BootでHTTP エラー画面をカスタマイズ(動的)|White Label Page


この記事では、
Spring Boot アプリケーションで、HTTP エラーが発生した場合に、ブラウザにWhite Label Pageではなく、エラーページを表示します。


関連情報(静的なエラーページ)

HTTP エラー発生時に静的なエラーページを表示する場合は、プログラムや設定ファイルをさわることなく、HTMLファイルを配置するのみで、カスタマイズすることができます。

開発環境


・Windows 10 64bit

・Eclipse 2018-12(Eclipse 4.10)

・Java 8

・Spring Boot 2.1.3(Spring Tool Suite 4)

・Thymeleaf 3.0.11

デフォルトのエラーページ(White Label Page)

Spring Boot アプリケーションは、HTTP エラーが発生した場合、デフォルトで、ブラウザにWhitelabel Error Pageを表示します。

例えば、
HTTP 404 エラーが発生すると、ブラウザでは、以下のような画面を表示します。


カスタムエラーページ(HTML)

ここでは、
HTTP エラーが発生した場合、ブラウザにWhite Label Pageを表示しないようにします。

HTTP エラーが発生した場合、
ステータスコードごとに、それぞれのエラーページを表示したり、エラーページにパラメータをわたして表示することができます。

HTTP エラー(動的)

任意のディレクトリにエラーページを配置して、ErrorViewResolverインターフェースを実装したクラスを作成します。

例えば、
以下のディレクトリ直下にエラーページ「404.html」、「4xx.html」、「5xx.html」を配置して、GlobalErrorViewResolverクラス(以下のソースコード)を作成すると、

HTTP 404のエラーが発生した場合は、「404.html」
HTTP 403のエラーが発生した場合は、「4xx.html」
HTTP 500のエラーが発生した場合は、「5xx.html」

のように表示することができます。

また、エラーページ「404.html」にパラメータ「message」を表示することができます。



・ディレクトリ

src/main/resources/templates/error

・エラーページ

xxx.html

* xxxは、404などのステータスコードを指定します。4xx、5xxのように指定することもできます。

・ソースコード(サンプル)
package com.xxx.xxx.xxx;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;

@Component
public class GlobalErrorViewResolver implements ErrorViewResolver {
    
    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request,
            HttpStatus status, Map<String, Object> model) {
        
        ModelAndView mav = new ModelAndView();
        
        // HTTP 404 error
        if (status == HttpStatus.NOT_FOUND) {
            
            mav.addObject("message", "HTTP 404 エラー メッセージ");
            mav.setViewName("error/404");
            
        // HTTP 4xx error
        } else if (status.is4xxClientError()) {
            
            mav.setViewName("error/4xx");
            
        // HTTP 5xx error
        } else if (status.is5xxServerError()) {
            
            mav.setViewName("error/5xx");
            
        } else {
            
            mav = null;
        }
        
        return mav;
    }
}

メモ

DefaultErrorViewResolverクラスの以下のメソッドの処理内容を参考にしました。

・ソースコード(メソッド)
@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status,
        Map<String, Object> model) {
    ModelAndView modelAndView = resolve(String.valueOf(status.value()), model);
    if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
        modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);
    }
    return modelAndView;
}





スポンサーリンク

0 件のコメント :

コメントを投稿