私の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ページを正しく設定する方法は?また、カスタムエラーページに静的ページだけでなくテンプレートを使用することは可能ですか?
Spring Boot 1.4.xでは、 カスタムエラーページ を追加できます。
特定のステータスコードのカスタムHTMLエラーページを表示する場合は、
/error
フォルダーにファイルを追加します。エラーページは、静的HTML(つまり、任意の静的リソースフォルダーの下に追加)またはテンプレートを使用して作成できます。ファイルの名前は、正確なステータスコードまたはシリーズマスクである必要があります。たとえば、404を静的HTMLファイルにマッピングするには、フォルダー構造は次のようになります。
src/ +- main/ +- Java/ | + <source code> +- resources/ +- public/ +- error/ | +- 404.html +- <other public assets>
Thymeleafを使用している場合、Thymeleafはコントローラーなしでエラーを処理できます。
一般的なエラーページの場合、このThymeleafページにはerror.html
という名前を付ける必要があります
_src/main/resources > templates > error.html
の下に配置する必要があります
特定のエラーページについては、src/main/resources/templates/error/404.html
のように、errorという名前のフォルダーにhttpエラーコードという名前のファイルを作成する必要があります。
質問で提案されているように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テンプレートディレクトリに配置する必要があります。動作させるために追加のコントローラーを追加する必要はありません。
新しいErrorPage(HttpStatus.NOT_FOUND、 "/ 404.html")
その/404.html
は、テンプレート名ではなく、リダイレクトするURLパスを表します。テンプレートを使用するように主張しているので、/404.html
を処理し、404.html
がsrc/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の代わりにテンプレートを使用することはあまり意味がありません。
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を使用しているため、エラーページに表示されるステータスメッセージとエラーメッセージをいつでも上書きできます。
クラスパスにthymeleafが存在するかどうかを確認するか、以下のコードを追加してプロジェクトを再インポートします。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
新しいものを追加する必要があります
@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";
}
}
Thymeleafは、コントローラーなしでエラーを処理できます。リソースフォルダにerror.htmlを作成します。