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:

    404 Not Found    

404 Not Found

404

Error java.lang.NullPointerException

Back to Home Page

и добавил его в папку /resources/templates/ . Прямо сейчас на ошибке 404 я вижу только белый экран.

Что я делаю неправильно и как правильно настроить страницу 404? Кроме того, можно ли использовать шаблоны, а не только статические страницы для пользовательских страниц ошибок?

В Spring Boot 1.4.x вы можете добавить страницу пользовательской ошибки :

Если вы хотите отобразить страницу пользовательских ошибок HTML для данного кода состояния, вы добавляете файл в папку /error . Страницы ошибок могут быть статическими HTML (т.е. добавлены в любую из статических папок ресурсов) или созданы с использованием шаблонов. Имя файла должно быть точным кодом состояния или маской серии.

Например, чтобы сопоставить 404 с статическим HTML-файлом, ваша структура папок будет выглядеть так:

 src/ +- main/ +- java/ | +  +- resources/ +- public/ +- error/ | +- 404.html +-  

Вы используете Thymeleaf, и Thymeleaf может обрабатывать ошибки без controllerа.

Для общей страницы ошибки эту страницу Thymeleaf нужно называть error.html
и должны быть помещены в src/main/resources > templates > error.html

Thymleaf error.html

Для конкретных страниц ошибок вам необходимо создать файлы, названные как код ошибки http, в папке с именем error, например: src/main/resources/templates/error/404.html .

новый ErrorPage (HttpStatus.NOT_FOUND, ” /404.html “)

Это /404.html представляет URL-адрес пути к перенаправлению , а не имя шаблона. Поскольку вы настаиваете на использовании шаблона, вы должны создать controller, который обрабатывает /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"; } } 

Вы также можете заменить эти controllerы рендеринга только с помощью View Viewer :

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

Кроме того, можно ли использовать шаблоны, а не только статические страницы для пользовательских страниц ошибок?

Да, это возможно. Но не найденные страницы, как правило, статичны, и использование шаблона вместо обычных HTML- страниц не будет иметь большого смысла.

Нет необходимости в компоненте EmbeddedServletContainerCustomizer . Простое размещение соответствующей страницы ошибки (например, 404.html в случае 404) в общедоступном каталоге должно быть достаточно (как указано @brunoid).

Также обратите внимание, что вы также можете поместить общую страницу error.html которая будет отображаться всякий раз, когда ваше приложение сталкивается с ошибкой или исключением.

Простой пример (во Фримаркере) –

     

Oops. Something went wrong

${status} ${error}

К

Oops. Something went wrong

${status} ${error}

Это отобразит надлежащее состояние ошибки и соответствующее сообщение об ошибке. И поскольку вы используете Spring Boot, вы всегда можете отменить сообщения о статусе и ошибках, которые отображаются на вашей странице ошибок.

Если вы используете Thymeleaf, как предлагается в вопросе, вы можете использовать шаблон, аналогичный шаблону из предыдущего ответа, но подходящий для Thymeleaf, а не для Freemarker. Я также добавил бутстрап для стилизации:

    Error Page      

Oops... something went wrong.

Вы должны поместить этот код в файл с именем error.html и поместить его в каталог шаблонов thymeleaf. Нет необходимости добавлять дополнительный controller для его работы.

Thymeleaf может обрабатывать ошибки без controllerа. создайте папку errors.html в ресурсах.