Spring Boot-пользовательская страница 404 с автономным tomcat
я запускаю приложение Spring boot внутри автономного экземпляра tomcat, и я пытаюсь переопределить страницы ошибок. Насколько я понимаю, Spring предоставляет фильтр ErrorPageFilter это позволяет мне просто настроить страницы ошибок как обычно для Springs EmbeddedServletContainerCustomizer
в этом случае точно.
таким образом, у меня есть стандартная автоматическая конфигурация/инициализатор сервлета в одном классе:
@Configuration
@ComponentScan
@EnableAutoConfiguration(exclude = [ GroovyTemplateAutoConfiguration, SecurityAutoConfiguration, ErrorMvcAutoConfiguration, JmxAutoConfiguration ] )
class Application extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
application.sources( Application )
}
(я использую тот же класс для автоконфигурации и servlet init, поэтому я просто передаю свой Application
класс в методе configure)
глядя на исходный код SpringBootServletInitializer похоже ErrorPageFilter
класс добавляется, просто расширяя этот класс здесь. Я выключил ErrorMvcAutoConfiguration
- но опять же, глядя на этот исходный код, похоже, что это просто установка страниц ошибок по умолчанию и на самом деле ничего не настраивает с помощью ErrorPageFilter
.
у меня тогда есть моя ошибка config файл:
@Configuration
class ErrorConfiguration implements EmbeddedServletContainerCustomizer {
@Override public void customize( ConfigurableEmbeddedServletContainer container ) {
container.addErrorPages(new ErrorPage( HttpStatus.NOT_FOUND, "/errors/404" ))
}
однако, если я просто посещаю недопустимый URL-адрес, и я DispatcherServlet
Не могу найти совпадение, тогда я просто получаю tomcats / 404.html-не мой взгляд, связанный с "/errors/404
"(у меня есть этот путь, сопоставленный с шаблоном представления thymeleaf, который отлично работает - если я перейду к / errors / 404, он отобразит ok)
есть идеи, почему моя пользовательская страница ошибок не работает? отслеживая журналы, я получаю строку о ErrorPageFilter
настраивается и настраивается ok при запуске приложения, но затем никаких упоминаний фильтр делает что угодно, когда приходит запрос.
2 ответов
вы можете использовать следующий код для более старых версий spring boot (0.5.x)
public class ServerCustomization extends ServerProperties {
@Override
public void customize(ConfigurableEmbeddedServletContainerFactory factory) {
super.customize(factory);
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,
"/yourpath/error-not-found.jsp"));
factory.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,
"/yourpath/error-internal.jsp"));
factory.addErrorPages(new ErrorPage("/yourpath/error-other.jsp"));
}
}
более новые версии spring boot (1.Выпуск х.) имеет некоторые рефакторинг вокруг сервера свойства. Смотрите ниже
public class ServerCustomization extends ServerProperties {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
super.customize(container);
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,
"/jsp/404.jsp"));
container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,
"/jsp/500.jsp"));
container.addErrorPages(new ErrorPage("/jsp/error.jsp"));
}
}
затем определите bean для инъекции ServerProperies.
@Bean
public ServerProperties getServerProperties() {
return new ServerCustomization();
}
образец проекта размещен в git
очень важно: если вы используете maven для сборки, вы должны хранить все файлы ресурсов в src / main / resources папка. В противном случае maven не добавит эти файлы в конечный артефакт jar.
вы можете использовать встроенное представление ошибки Spring Boot, реализуя представление с именем error
, или выключите его, установив error.whitelabel.enabled=false
собственность и реализовать свой собственный. Это объяснил больше в документах.