rhi*_*nds 8 spring tomcat spring-mvc 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 )
}
Run Code Online (Sandbox Code Playgroud)
(我使用相同的类进行自动配置和servlet初始化,这就是为什么我只是Application在configure方法中传递我的类)
查看SpringBootServletInitializer的源代码,看起来ErrorPageFilter只是通过在这里扩展该类来添加类.我已经关闭了ErrorMvcAutoConfiguration- 但是再一次,查看源代码,它看起来只是设置默认错误页面而不是实际设置任何东西ErrorPageFilter.
然后我有我的错误配置文件:
@Configuration
class ErrorConfiguration implements EmbeddedServletContainerCustomizer {
@Override public void customize( ConfigurableEmbeddedServletContainer container ) {
container.addErrorPages(new ErrorPage( HttpStatus.NOT_FOUND, "/errors/404" ))
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是访问一个无效的网址,而我DispatcherServlet找不到匹配,那么我只是得到tomcats /404.html - 而不是我的视图链接到" /errors/404"(我将此路径映射到百里香视图模板,工作正常 - 如果我导航到/ errors/404则显示ok)
我的自定义错误页面无效的任何想法?跟踪日志,我得到一条关于ErrorPageFilter正在配置并在应用程序启动时设置好的行,但是当请求进来时没有提到过滤器做任何事情.
对于旧版本的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"));
}
}
Run Code Online (Sandbox Code Playgroud)
较新的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"));
}
}
Run Code Online (Sandbox Code Playgroud)
然后定义一个bean来注入ServerProperies.
@Bean
public ServerProperties getServerProperties() {
return new ServerCustomization();
}
Run Code Online (Sandbox Code Playgroud)
示例项目发布在git中
非常重要:如果您使用maven进行构建,则必须将所有资源文件存储在src/main/resources文件夹下.否则,maven不会将这些文件添加到最终的jar工件中.
| 归档时间: |
|
| 查看次数: |
16768 次 |
| 最近记录: |