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 собственность и реализовать свой собственный. Это объяснил больше в документах.