web-dev-qa-db-ja.com

Spring Bootおよびカスタム404エラーページ

私のSpring Bootアプリケーションでは、404などのカスタムエラーページを設定しようとしています。アプリケーション設定に次のBeanを追加しました:

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));
        }
    };
}

また、次のシンプルなThymeleafテンプレートを作成しました。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>404 Not Found</title>
        <meta charset="utf-8" />
    </head>
    <body>
        <h3>404 Not Found</h3>
        <h1 th:text="${errorCode}">404</h1>
        <p th:utext="${errorMessage}">Error Java.lang.NullPointerException</p>
        <a href="/" th:href="@{/}">Back to Home Page</a>
    </body>
</html>

/resources/templates/フォルダーに追加しました。現在、404エラーでは白い画面しか表示されません。

何が間違っていますか、404ページを正しく設定する方法は?また、カスタムエラーページに静的ページだけでなくテンプレートを使用することは可能ですか?

28
brunoid

Spring Boot 1.4.xでは、 カスタムエラーページ を追加できます。

特定のステータスコードのカスタムHTMLエラーページを表示する場合は、/errorフォルダーにファイルを追加します。エラーページは、静的HTML(つまり、任意の静的リソースフォルダーの下に追加)またはテンプレートを使用して作成できます。ファイルの名前は、正確なステータスコードまたはシリーズマスクである必要があります。

たとえば、404を静的HTMLファイルにマッピングするには、フォルダー構造は次のようになります。

src/
 +- main/
     +- Java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>
49
brunoid

Thymeleafを使用している場合、Thymeleafはコントローラーなしでエラーを処理できます。

一般的なエラーページの場合、このThymeleafページにはerror.htmlという名前を付ける必要があります
_src/main/resources > templates > error.htmlの下に配置する必要があります

Thymleaf error.html

特定のエラーページについては、src/main/resources/templates/error/404.htmlのように、errorという名前のフォルダーにhttpエラーコードという名前のファイルを作成する必要があります。

25
GoutamS

質問で提案されているようにThymeleafを使用している場合は、前の返信からのものに似ていますが、FreemarkerではなくThymeleafに適したテンプレートを使用できます。スタイリング用にbootstrapも追加しました:

<!DOCTYPE html>
<html lang="en"
      xmlns:th="http://www.thymeleaf.org">
<head>
<title>Error Page</title>
<link href="/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" rel="stylesheet" media="screen"/>
<script src="/webjars/jquery/3.2.1/jquery.min.js"></script>
<script src="/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="jumbotron alert-danger">
    <h1>Oops... something went wrong.</h1>
    <h2 th:text="${status + ' ' + error}"></h2>
</div>
</div>
</body>
</html>

このコードをerror.htmlというファイルに配置し、thymeleafテンプレートディレクトリに配置する必要があります。動作させるために追加のコントローラーを追加する必要はありません。

4
OlgaMaciaszek

新しいErrorPage(HttpStatus.NOT_FOUND、 "/ 404.html")

その/404.htmlは、テンプレート名ではなく、リダイレクトするURLパスを表します。テンプレートを使用するように主張しているので、/404.htmlを処理し、404.htmlsrc/main/resources/templatesにあることをレンダリングするコントローラーを作成する必要があります。

@Controller
public class NotFoundController {
    @RequestMapping("/404.html")
    public String render404(Model model) {
        // Add model attributes
        return "404";
    }
}

また、これらのビューレンダラーコントローラをView Controllerに置き換えることもできます。

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/404.html").setViewName("404");
    }
}

また、カスタムエラーページに静的ページだけでなくテンプレートを使用することは可能ですか?

はい、可能です。しかし、Not Foundページは通常静的であり、Plain Old HTMLsの代わりにテンプレートを使用することはあまり意味がありません。

4
Ali Dehghani

EmbeddedServletContainerCustomizer Beanは必要ありません。対応するエラーページ(404の場合は404.htmlなど)を単純にパブリックディレクトリに置くだけで十分です(@brunoidが指すように)。

また、アプリケーションでエラーや例外が発生したときに表示される汎用のerror.htmlページを配置することもできます。

簡単な例(Freemarker)-

<html lang="en">
<head>
</head>
<body>
    <div class="container">
        <div class="jumbotron alert-danger">
            <h1>Oops. Something went wrong</h1>
            <h2>${status} ${error}</h2>
        </div>
    </div>
</body>

</html>

これにより、適切なエラーステータスと対応するエラーメッセージが表示されます。また、Spring Bootを使用しているため、エラーページに表示されるステータスメッセージとエラーメッセージをいつでも上書きできます。

4
Naiyer

クラスパスにthymeleafが存在するかどうかを確認するか、以下のコードを追加してプロジェクトを再インポートします。

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
1
Himadri Mandal

新しいものを追加する必要があります

 @Controller
public class MyErrorController implements ErrorController  {

    @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 "error404";
        }
        else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
            return "error500";
        }
    }
    return "error";
}

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

Thymeleafは、コントローラーなしでエラーを処理できます。リソースフォルダにerror.htmlを作成します。

0
sujoydutta