Spring Boot - 自定义404页面,带有独立的tomcat

时间:2014-12-09 18:33:32

标签: spring spring-mvc tomcat spring-boot

我在独立的tomcat实例中运行Spring启动应用程序,我试图覆盖错误页面。根据我的理解,Spring提供了一个过滤器ErrorPageFilter,它允许我像Spring EmbeddedServletContainerCustomizer一样正常设置错误页面来完全处理这种情况。

所以我在一个类中有我的标准自动配置/ servlet初始化程序:

@Configuration
@ComponentScan
@EnableAutoConfiguration(exclude = [ GroovyTemplateAutoConfiguration, SecurityAutoConfiguration, ErrorMvcAutoConfiguration, JmxAutoConfiguration ] )
class Application extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
        application.sources( Application )
    }

(我使用相同的类进行自动配置和servlet初始化,这就是我在配置方法中传递Application类的原因)

查看SpringBootServletInitializer的源代码,看起来只是通过在此处扩展该类来添加ErrorPageFilter类。我已经关闭了ErrorMvcAutoConfiguration - 但是再一次,查看源代码看起来只是设置默认错误页面而不是实际使用ErrorPageFilter设置任何内容。

然后我有我的错误配置文件:

@Configuration
class ErrorConfiguration implements EmbeddedServletContainerCustomizer {

    @Override public void customize( ConfigurableEmbeddedServletContainer container ) {
        container.addErrorPages(new ErrorPage( HttpStatus.NOT_FOUND, "/errors/404" ))
    }

但是,如果我只是访问了无效的网址,并且我DispatcherServlet无法找到匹配项,那么我只会获得tomcats /404.html - 而不是我的视图链接到" {{1 }}" (我将此路径映射到百里香视图模板,工作正常 - 如果我导航到/ errors / 404则显示正常)

为什么我的自定义错误页面无效?跟踪日志,我得到一行关于正在配置的/errors/404并在应用程序启动时设置好,但是当请求进来时没有提到过滤器正在做任何事情。

2 个答案:

答案 0 :(得分:8)

对于早期版本的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启动版本(1.X.RELEASE)在ServerProperties周围进行了一些重构。见下文,

  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工件中。

答案 1 :(得分:3)

您可以通过实现名为error的视图来使用Spring Boot的内置错误视图,也可以通过设置error.whitelabel.enabled=false属性并实现自己的属性来关闭它。这是explained more in the docs