tomcat上的Spring Boot war文件:errorPageFilter不能转换为TomcatEmbeddedServletContainerFactory [英] Spring Boot war file on tomcat: errorPageFilter cannot be cast to TomcatEmbeddedServletContainerFactory

查看:1199
本文介绍了tomcat上的Spring Boot war文件:errorPageFilter不能转换为TomcatEmbeddedServletContainerFactory的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将一个简单的Spring Boot应用程序转换成war文件以部署到我的tomcat服务器,但是我一直在收到这个错误:

 原因:org.springframework.context.ApplicationContextException:无法启动嵌入容器;嵌套的异常是org.springframework.beans.factory.BeanCreationException:创建名为'errorPageFilter'的bean时出错:Bean初始化失败;嵌套异常是java.lang.ClassCastException:org.springframework.boot.context.web.ErrorPageFilter无法转换为org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory 

当我将它作为jar运行时,此Spring Boot应用完美运行,但如果我创建了一场战争,它会给我带来错误。据我所知,我完全遵循了Spring指南:<​​a href =http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a- deployable-war-filerel =nofollow> http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file



这是我的应用程序类:

  @Configuration 
@EnableWebMvc
@ComponentScan({XXX})
@EnableAutoConfiguration
@EnableConfigurationProperties
@SpringBootApplication
@EnableAsync
公共类应用程序扩展SpringBootServletInitializer {

@Override
保护SpringApplicationBuilder配置(SpringApplicationBuilder应用程序){
返回application.sources(Application.class);


public static void main(String [] args){
SpringApplication.run(Application.class,args);
}

}

这是我的build.gradle:

  buildscript {
ext {
springBootVersion ='1.2.6.RELEASE'
}
repositories {
maven {urlhttp://repo.spring.io/libs-release}
maven {urlhttp://repo.spring.io/libs-snapshot }
mavenCentral()
mavenLocal()
}
依赖{
classpath(org.springframework.boot:spring-boot-gradle-plugin:$ { springBootVersion})
}
}

apply plugin:'war'
apply plugin:'java'
apply plugin:'idea'
apply plugin:'spring-boot'
apply plugin:'application'

war {
archiveName'hello-gradle.war'
}

配置{
providedRuntime
}

compileJava {
targetCompatibility = 1.8
sourceCompatibility = 1.8
}

mainClassName =XXX.Applicat离子

存储库{
mavenCentral()
maven {urlhttp://repo.spring.io/libs-release}
maven {url http://repo.spring.io/libs-snapshot}
maven {urlhttp://maven.springframework.org/milestone}
}

依赖关系{

编译fileTree(dir:'libs',include:['* .jar'])

编译'com.fasterxml.jackson.core:jackson-databind: 2.3.2'
compile'c​​om.fasterxml.jackson.core:jackson-core:2.5.3'

compile'org.springframework.boot:spring-boot-starter-web'
compile'org.springframework.boot:spring-boot-starter-tomcat'
compile'org.springframework.boot:spring-boot-starter-security'
compile'org.springframework。 boot:spring-boot-starter-actuator'
compile'org.springframework.boot:spring-boot-starter-aop'
compile'org.mongodb:mongo-java-driver:3.1.0'
compile'org.springframework.data:spring-data-mongodb :1.8.0.RELEASE'
compile(org.springframework:spring-context-support)

providedRuntime'org.springframework.boot:spring-boot-starter-tomcat'


任务包装器(类型:包装器){
gradleVersion ='2.8'
}
b

这是我的catalina.log: 12-Dec-2015 14:53:54.921 INFO [localhost-startStop-1]
> org.apache.catalina.startup.HostConfig.deployWAR部署web
>应用程序档案C:\ Tomcat8\webapps\hello-gradle.war已完成
> in 4,900 ms 12-Dec-2015 14:53:54.921 INFO [localhost-startStop-1]
> org.apache.catalina.startup.HostConfig.deployDirectory部署web
>应用程序目录C:\ Tomcat8\webapps\docs 12-Dec-2015 14:53:54.993
> INFO [localhost-startStop-1]
> org.apache.catalina.startup.HostConfig.deployDirectory部署
> Web应用程序目录C:\ Tomcat8 \webapps\docs已在72
>中完成。 ms 12-Dec-2015 14:53:54.993 INFO [localhost-startStop-1]
> org.apache.catalina.startup.HostConfig.deployDirectory部署web
>应用程序目录C:\ Tomcat8 \webapps\examples 12-Dec-2015
> 14:53:55.239 INFO [localhost-startStop-1]
> org.apache.catalina.startup.HostConfig.deployDirectory部署
> Web应用程序目录C:\Tomcat8\webapps\examples已在
>中完成246 ms 12-Dec-2015 14:53:55.239 INFO [localhost-startStop-1]
> org.apache.catalina.startup.HostConfig.deployDirectory部署web
>应用程序目录C:\ Tomcat8\webapps\host-manager 12-Dec-2015
> 14:53:55.262 INFO [localhost-startStop-1]
> org.apache.catalina.startup.HostConfig.deployDirectory部署
> Web应用程序目录C:\ Tomcat8\webapps\host-manager已完成
> 23 ms 12-Dec-2015 14:53:55.262 INFO [localhost-startStop-1]
> org.apache.catalina.startup.HostConfig.deployDirectory部署web
>应用程序目录C:\ Tomcat8\webapps\manager 12-Dec-2015
> 14:53:55.283 INFO [localhost-startStop-1]
> org.apache.catalina.startup.HostConfig.deployDirectory部署
> Web应用程序目录C:\ Tomcat8\webapps\manager已在
>中完成21 ms 12-Dec-2015 14:53:55.284 INFO [localhost-startStop-1]
> org.apache.catalina.startup.HostConfig.deployDirectory部署web
>应用程序目录C:\ Tomcat8 \webapps\ROOT 12-Dec-2015 14:53:55.316
> INFO [localhost-startStop-1]
> org.apache.catalina.startup.HostConfig.deployDirectory部署
> Web应用程序目录C:\ Tomcat8\webapps\ROOT已在32
>中完成ms 12-Dec-2015 14:53:55.328 INFO [main]
> org.apache.coyote.AbstractProtocol.start启动ProtocolHandler
> [http-apr-8080] 12-Dec-2015 14:53:55.337 INFO [main]
> org.apache.coyote.AbstractProtocol.start启动ProtocolHandler
> [ajp-apr-8009] 12-Dec-2015 14:53:55.340 INFO [main]
> org.apache.catalina.startup.Catalina.start服务器在5354启动ms
> 12-Dec-2015 14:54:25.834 INFO
> [ContainerBackgroundProcessor [StandardEngine [Catalina]]]
> org.apache.catalina.startup.HostConfig.undeploy取消部署上下文
> [/ hello-gradle] 12-Dec-2015 14:54:25.847严重
> [ContainerBackgroundProcessor [StandardEngine [Catalina]]]
> org.apache.catalina.startup.ExpandWar.deleteDir
> [C:\ Tomcat8\webapps\hello-gradle\WEB-INF\lib]不能完全是
>删除。其余文件的存在可能会导致问题
> 12-Dec-2015 14:54:25.848 SEVERE
> [ContainerBackgroundProcessor [StandardEngine [Catalina]]]
> org.apache.catalina.startup.ExpandWar.deleteDir
> [C:\ Tomcat8 \webapps\hello-gradle\WEB-INF]不能完全是
>删除。其余文件的存在可能会导致问题
> 12-Dec-2015 14:54:25.848 SEVERE
> [ContainerBackgroundProcessor [StandardEngine [Catalina]]]
> org.apache.catalina.startup.ExpandWar.deleteDir
> [C:\ Tomcat8\webapps\hello-gradle]无法完全删除。
>剩余文件的存在可能会导致问题12-Dec-2015
> 14:54:25.849 SEVERE
> [ContainerBackgroundProcessor [StandardEngine [Catalina]]]
> org.apache.catalina.startup.ExpandWar.delete
> [C:\ Tomcat8\webapps\hello-gradle]无法完全删除。
>剩余文件的存在可能会导致问题12-Dec-2015
> 14:54:25.851 INFO [localhost-startStop-2]
> org.apache.catalina.startup.HostConfig.deployDirectory部署web
>应用程序目录C:\ Tomcat8\webapps\hello-gradle 12-Dec-2015
> 14:54:27.196 INFO [localhost-startStop-2]
> org.apache.catalina.startup.HostConfig.deployDirectory部署
> Web应用程序目录C:\ Tomcat8\webapps\hello-gradle已完成
> in 1,345 ms 12-Dec-2015 14:54:35.176 INFO [http-apr-8080-exec-12]
> org.apache.catalina.startup.HostConfig.undeploy取消部署上下文
> [/ hello-gradle] 12-Dec-2015 14:54:35.203 INFO [http-apr-8080-exec-12]
> org.apache.catalina.startup.HostConfig.deployWAR部署web
>应用程序档案C:\ Tomcat8\webapps\hello-gradle.war 12-Dec-2015
> 14:54:39.295 SEVERE [http-apr-8080-exec-12]
> org.apache.catalina.core.ContainerBase.addChildInternal
> ContainerBase.addChild:start:
> org.apache.catalina.LifecycleException:无法启动组件
> [StandardEngine [Catalina] .StandardHost [localhost] .StandardContext [/ hello-gradle]]
>在
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
>在
> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
>在
> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
>在
> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
>在
> org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945)
>在
> org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:466)
>在org.apache.catalina.startup.HostConfig.check(HostConfig.java:1583)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>在
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>在java.lang.reflect.Method.invoke(Method.java:497)at
> org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
>在
> com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
>在
> com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
>在
> org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1460)
>在
> org.apache.catalina.manager.HTMLManagerServlet.upload(HTMLManagerServlet.java:288)
>在
> org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:209)
>在javax.servlet.http.HttpServlet.service(HttpServlet.java:648)at
> javax.servlet.http.HttpServlet.service(HttpServlet.java:729)at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
>在
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>在
> org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:136)
>在
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
>在
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>在
> org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
>在
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
>在
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>在
> org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
>在
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
>在
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>在
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
>在
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
>在
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
>在
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
>在
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
>在
> org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
>在
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
>在
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
>在
> org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
>在
> org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:674)
>在
> org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.doRun(AprEndpoint.java:2500)
>在
> org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.run(AprEndpoint.java:2489)
>在
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>在
> java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)
>在
> org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)
>在java.lang.Thread.run(Thread.java:745)引起:
> org.springframework.context.ApplicationContextException:无法
>启动嵌入式容器;嵌套异常是
> org.springframework.beans.factory.BeanCreationException:错误
>创建名为'errorPageFilter'的bean:初始化bean
>失败;嵌套异常是java.lang.ClassCastException:
> org.springframework.boot.context.web.ErrorPageFilter无法转换为
> org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
>在
> org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
>在
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:474)
>在
> org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
>在
> org.springframework.boot.SpringApplication.refresh(SpringApplication.java:687)
>在
> org.springframework.boot.SpringApplication.run(SpringApplication.java:321)
>在
> org.springframework.boot.context.web.SpringBootServletInitializer.run(SpringBootServletInitializer.java:133)
>在
> org.springframework.boot.context.web.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:124)
>在
> org.springframework.boot.context.web.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:81)
>在
> org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:175)
>在
> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5244)
>在
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
> ... 45更多原因:
> org.springframework.beans.factory.BeanCreationException:错误
>创建名为'errorPageFilter'的bean:初始化bean
>失败;嵌套异常是java.lang.ClassCastException:
> org.springframework.boot.context.web.ErrorPageFilter无法转换为
> org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
>在
> org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:303)
>在
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
>在
> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
>在
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
>在
> org.springframework.boot.context.embedded.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:209)
>在
> org.springframework.boot.context.embedded.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:165)
>在
> org.springframework.boot.context.embedded.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:160)
>在
> org.springframework.boot.context.embedded.ServletContextInitializerBeans.addAdaptableBeans(ServletContextInitializerBeans.java:143)
>在
> org.springframework.boot.context.embedded.ServletContextInitializerBeans。< init>(ServletContextInitializerBeans.java:74)
>在
> org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getServletContextInitializerBeans(EmbeddedWebApplicationContext.java:234)
>在
> org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.selfInitialize(EmbeddedWebApplicationContext.java:221)
>在
> org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.access $ 000(EmbeddedWebApplicationContext.java:84)
>在
> org.springframework.boot.context.embedded.EmbeddedWebApplicationContext $ 1.onStartup(EmbeddedWebApplicationContext.java:206)
>在
> org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:162)
>在
> org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
> ... 55更多原因:java.lang.ClassCastException:
> org.springframework.boot.context.web.ErrorPageFilter无法转换为
> org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
>在
> com.futureprocessing.spring.ContainerConfiguration $ 1.customize(ContainerConfiguration.java:34)
>在
> org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor.postProcessBeforeInitialization(EmbeddedServletContainerCustomizerBeanPostProcessor.java:67)
>在
> org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor.postProcessBeforeInitialization(EmbeddedServletContainerCustomizerBeanPostProcessor.java:54)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1566)
>在
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
> ... 71更多
>
> 12-Dec-2015 14:54:39.321 SEVERE [http-apr-8080-exec-12]
> org.apache.catalina.startup.HostConfig.deployWAR部署web
时出错>应用程序档案C:\ Tomcat8\webapps\hello-gradle.war
> java.lang.IllegalStateException:ContainerBase.addChild:start:
> org.apache.catalina.LifecycleException:无法启动组件
> [StandardEngine [Catalina] .StandardHost [localhost] .StandardContext [/ hello-gradle]]
>在
> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:729)
>在
> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
>在
> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
>在
> org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945)
>在
> org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:466)
>在org.apache.catalina.startup.HostConfig.check(HostConfig.java:1583)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>在
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>在java.lang.reflect.Method.invoke(Method.java:497)at
> org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
>在
> com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
>在
> com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
>在
> org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1460)
>在
> org.apache.catalina.manager.HTMLManagerServlet.upload(HTMLManagerServlet.java:288)
>在
> org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:209)
>在javax.servlet.http.HttpServlet.service(HttpServlet.java:648)at
> javax.servlet.http.HttpServlet.service(HttpServlet.java:729)at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
>在
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>在
> org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:136)
>在
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
>在
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>在
> org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
>在
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
>在
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>在
> org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
>在
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
>在
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>在
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
>在
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
>在
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
>在
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
>在
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
>在
> org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
>在
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
>在
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
>在
> org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
>在
> org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:674)
>在
> org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.doRun(AprEndpoint.java:2500)
>在
> org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.run(AprEndpoint.java:2489)
>在
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>在
> java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)
>在
> org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)
>在java.lang.Thread.run(Thread.java:745)
>
> 12-Dec-2015 14:54:39.327 INFO [http-apr-8080-exec-12]
> org.apache.catalina.startup.HostConfig.deployWAR部署web
>应用程序档案C:\ Tomcat8\webapps\hello-gradle.war已完成
>在4,123毫秒

它确实说错误发生在我的java文件中,名为 ContainerConfiguration.java

  @Configuration 
public class ContainerConfiguration {

@Bean
EmbeddedServletContainerCustomizer containerCustomizer(
//全部取自application.properties文件
@Value($ {keystore.file})String keystoreFile,
@ Value($ {server.port})final String serverPort,
@Value($ {keystore.pass})final String keystorePass)
throws异常{

//这是在嵌入式Tomcat
上使用Spring Boot设置https的锅炉板代码:

final String absoluteKeystoreFile = new File(keystoreFile)
.getAbsolutePath();

返回新的EmbeddedServletContainerCustomizer(){
@Override
public void customize(ConfigurableEmbeddedServletContainer container){
TomcatEmbeddedServletContainerFactory tomcat =(TomcatEmbeddedServletContainerFactory)container;
tomcat.addConnectorCustomizers(connector - > {
connector.setPort(Integer.parseInt(serverPort));
connector.setSecure(true);
connector.setScheme(https );

Http11NioProtocol proto =(Http11NioProtocol)连接器
.getProtocolHandler();
proto.setSSLEnabled(true);

proto.setKeystoreFile( (keystorePass);
proto.setKeystoreType(JKS);
proto.setKeyAlias(abcd);
});
proto.setKeyStorePass
}
};


$ / code $ / pre

错误在这一行:



$ $ p $ tomcat.addConnectorCustomizers(connector - > {
connector.setPort(Integer.parseInt(serverPort));
connector .setSecure(true);
connector.setScheme(https);

I don 't code> errorPageFilter 被转换为 TomcatEmbeddedServletContainerFactory



有人知道我可以如何解决这个错误吗?



编辑:

我也创建了一个简单的SpringBoot测试应用程序来演示这个错误,你可以在这里找到它: https:// github .com / Winghin2517 / testSpringBootTomcat



github回购中只有两个类:


  1. ContainerConfiguration - 攻击类是s的地方

  2. DemoApplication - 主要方法位于此

  3. 如果您注释掉ContainerConfiguration并且建立一个战争文件,然后将其上传到一个Tomcat服务器,它完美的工作。
    如果取消ContainerConfiguration的注释并构建war文件并上传它,您将会收到错误消息。

    解决方案

    您正尝试使用您的定制器自定义SSL连接。
    如果您启动嵌入式tomcat服务器,这是100%合法的。所以流程如下:


    • 您自定义tomcat安装程序

    • 启动服务器
    • li>


    EmbeddedServletContainerCustomizer的JavaDocs


    自定义自动配置嵌入式servlet
    容器的策略接口。任何这种类型的bean在容器本身启动之前都会收到一个
    容器工厂的回调,所以你
    可以设置端口,地址,错误页面等。


    相反,你不能在已经运行的tomcat上定制任何这些东西。



    想象一下,如果您可以选择更改正在运行的tomcat的端口/地址并且只部署war文件,那么您可能面临哪种安全问题。



    如果你真的需要自定义ssl连接器,你需要深入到tomcat的xml配置中。 b
    $ b

    简单的指南可以在这里找到


    I'm trying to convert a simple Spring Boot app into a war file for deployment to my tomcat server but I keep on getting this error:

    Caused by: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'errorPageFilter': Initialization of bean failed; nested exception is java.lang.ClassCastException: org.springframework.boot.context.web.ErrorPageFilter cannot be cast to org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
    

    This Spring Boot app works perfectly when I run it as a jar but if I create a war, it gives me errors. As far as I can tell, I followed the Spring guide for this perfectly: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

    This is my application class:

    @Configuration
    @EnableWebMvc
    @ComponentScan({"XXX"})
    @EnableAutoConfiguration
    @EnableConfigurationProperties
    @SpringBootApplication
    @EnableAsync
    public class Application extends SpringBootServletInitializer {
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(Application.class);
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    

    This is my build.gradle:

    buildscript {
        ext {
            springBootVersion = '1.2.6.RELEASE'
        }
        repositories {
            maven { url "http://repo.spring.io/libs-release" }
            maven { url "http://repo.spring.io/libs-snapshot" }
            mavenCentral()
            mavenLocal()
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        }
    }
    
    apply plugin: 'war'
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'spring-boot'
    apply plugin: 'application'
    
    war {
        archiveName 'hello-gradle.war'
    }
    
    configurations {
        providedRuntime
    }
    
    compileJava {
        targetCompatibility = 1.8
        sourceCompatibility = 1.8
    }
    
    mainClassName = "XXX.Application"
    
    repositories {
        mavenCentral()
        maven { url "http://repo.spring.io/libs-release" }
        maven { url "http://repo.spring.io/libs-snapshot" }
        maven { url "http://maven.springframework.org/milestone" }
    }
    
    dependencies {
    
        compile fileTree(dir: 'libs', include: ['*.jar'])
    
        compile 'com.fasterxml.jackson.core:jackson-databind:2.3.2'
        compile 'com.fasterxml.jackson.core:jackson-core:2.5.3'
    
        compile 'org.springframework.boot:spring-boot-starter-web'
        compile 'org.springframework.boot:spring-boot-starter-tomcat'
        compile 'org.springframework.boot:spring-boot-starter-security'
        compile 'org.springframework.boot:spring-boot-starter-actuator'
        compile 'org.springframework.boot:spring-boot-starter-aop'
        compile 'org.mongodb:mongo-java-driver:3.1.0'
        compile 'org.springframework.data:spring-data-mongodb:1.8.0.RELEASE'
        compile("org.springframework:spring-context-support")
    
        providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    }
    
    task wrapper(type: Wrapper) {
        gradleVersion = '2.8'
    }
    

    This is my catalina.log:

    > 12-Dec-2015 14:53:54.921 INFO [localhost-startStop-1]
    > org.apache.catalina.startup.HostConfig.deployWAR Deployment of web
    > application archive C:\Tomcat8\webapps\hello-gradle.war has finished
    > in 4,900 ms 12-Dec-2015 14:53:54.921 INFO [localhost-startStop-1]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deploying web
    > application directory C:\Tomcat8\webapps\docs 12-Dec-2015 14:53:54.993
    > INFO [localhost-startStop-1]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deployment of
    > web application directory C:\Tomcat8\webapps\docs has finished in 72
    > ms 12-Dec-2015 14:53:54.993 INFO [localhost-startStop-1]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deploying web
    > application directory C:\Tomcat8\webapps\examples 12-Dec-2015
    > 14:53:55.239 INFO [localhost-startStop-1]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deployment of
    > web application directory C:\Tomcat8\webapps\examples has finished in
    > 246 ms 12-Dec-2015 14:53:55.239 INFO [localhost-startStop-1]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deploying web
    > application directory C:\Tomcat8\webapps\host-manager 12-Dec-2015
    > 14:53:55.262 INFO [localhost-startStop-1]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deployment of
    > web application directory C:\Tomcat8\webapps\host-manager has finished
    > in 23 ms 12-Dec-2015 14:53:55.262 INFO [localhost-startStop-1]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deploying web
    > application directory C:\Tomcat8\webapps\manager 12-Dec-2015
    > 14:53:55.283 INFO [localhost-startStop-1]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deployment of
    > web application directory C:\Tomcat8\webapps\manager has finished in
    > 21 ms 12-Dec-2015 14:53:55.284 INFO [localhost-startStop-1]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deploying web
    > application directory C:\Tomcat8\webapps\ROOT 12-Dec-2015 14:53:55.316
    > INFO [localhost-startStop-1]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deployment of
    > web application directory C:\Tomcat8\webapps\ROOT has finished in 32
    > ms 12-Dec-2015 14:53:55.328 INFO [main]
    > org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler
    > ["http-apr-8080"] 12-Dec-2015 14:53:55.337 INFO [main]
    > org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler
    > ["ajp-apr-8009"] 12-Dec-2015 14:53:55.340 INFO [main]
    > org.apache.catalina.startup.Catalina.start Server startup in 5354 ms
    > 12-Dec-2015 14:54:25.834 INFO
    > [ContainerBackgroundProcessor[StandardEngine[Catalina]]]
    > org.apache.catalina.startup.HostConfig.undeploy Undeploying context
    > [/hello-gradle] 12-Dec-2015 14:54:25.847 SEVERE
    > [ContainerBackgroundProcessor[StandardEngine[Catalina]]]
    > org.apache.catalina.startup.ExpandWar.deleteDir
    > [C:\Tomcat8\webapps\hello-gradle\WEB-INF\lib] could not be completely
    > deleted. The presence of the remaining files may cause problems
    > 12-Dec-2015 14:54:25.848 SEVERE
    > [ContainerBackgroundProcessor[StandardEngine[Catalina]]]
    > org.apache.catalina.startup.ExpandWar.deleteDir
    > [C:\Tomcat8\webapps\hello-gradle\WEB-INF] could not be completely
    > deleted. The presence of the remaining files may cause problems
    > 12-Dec-2015 14:54:25.848 SEVERE
    > [ContainerBackgroundProcessor[StandardEngine[Catalina]]]
    > org.apache.catalina.startup.ExpandWar.deleteDir
    > [C:\Tomcat8\webapps\hello-gradle] could not be completely deleted. The
    > presence of the remaining files may cause problems 12-Dec-2015
    > 14:54:25.849 SEVERE
    > [ContainerBackgroundProcessor[StandardEngine[Catalina]]]
    > org.apache.catalina.startup.ExpandWar.delete
    > [C:\Tomcat8\webapps\hello-gradle] could not be completely deleted. The
    > presence of the remaining files may cause problems 12-Dec-2015
    > 14:54:25.851 INFO [localhost-startStop-2]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deploying web
    > application directory C:\Tomcat8\webapps\hello-gradle 12-Dec-2015
    > 14:54:27.196 INFO [localhost-startStop-2]
    > org.apache.catalina.startup.HostConfig.deployDirectory Deployment of
    > web application directory C:\Tomcat8\webapps\hello-gradle has finished
    > in 1,345 ms 12-Dec-2015 14:54:35.176 INFO [http-apr-8080-exec-12]
    > org.apache.catalina.startup.HostConfig.undeploy Undeploying context
    > [/hello-gradle] 12-Dec-2015 14:54:35.203 INFO [http-apr-8080-exec-12]
    > org.apache.catalina.startup.HostConfig.deployWAR Deploying web
    > application archive C:\Tomcat8\webapps\hello-gradle.war 12-Dec-2015
    > 14:54:39.295 SEVERE [http-apr-8080-exec-12]
    > org.apache.catalina.core.ContainerBase.addChildInternal
    > ContainerBase.addChild: start:  
    > org.apache.catalina.LifecycleException: Failed to start component
    > [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/hello-gradle]]
    >   at
    > org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    >   at
    > org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
    >   at
    > org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    >   at
    > org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    >   at
    > org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945)
    >   at
    > org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:466)
    >   at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1583)
    >   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at
    > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    >   at
    > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    >   at java.lang.reflect.Method.invoke(Method.java:497)     at
    > org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    >   at
    > com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    >   at
    > com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    >   at
    > org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1460)
    >   at
    > org.apache.catalina.manager.HTMLManagerServlet.upload(HTMLManagerServlet.java:288)
    >   at
    > org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:209)
    >   at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)     at
    > javax.servlet.http.HttpServlet.service(HttpServlet.java:729)  at
    > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    >   at
    > org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:136)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    >   at
    > org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    >   at
    > org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    >   at
    > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    >   at
    > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    >   at
    > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
    >   at
    > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    >   at
    > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    >   at
    > org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    >   at
    > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    >   at
    > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
    >   at
    > org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
    >   at
    > org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
    >   at
    > org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2500)
    >   at
    > org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2489)
    >   at
    > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    >   at
    > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    >   at
    > org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    >   at java.lang.Thread.run(Thread.java:745) Caused by:
    > org.springframework.context.ApplicationContextException: Unable to
    > start embedded container; nested exception is
    > org.springframework.beans.factory.BeanCreationException: Error
    > creating bean with name 'errorPageFilter': Initialization of bean
    > failed; nested exception is java.lang.ClassCastException:
    > org.springframework.boot.context.web.ErrorPageFilter cannot be cast to
    > org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
    >   at
    > org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
    >   at
    > org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:474)
    >   at
    > org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
    >   at
    > org.springframework.boot.SpringApplication.refresh(SpringApplication.java:687)
    >   at
    > org.springframework.boot.SpringApplication.run(SpringApplication.java:321)
    >   at
    > org.springframework.boot.context.web.SpringBootServletInitializer.run(SpringBootServletInitializer.java:133)
    >   at
    > org.springframework.boot.context.web.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:124)
    >   at
    > org.springframework.boot.context.web.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:81)
    >   at
    > org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:175)
    >   at
    > org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5244)
    >   at
    > org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    >   ... 45 more Caused by:
    > org.springframework.beans.factory.BeanCreationException: Error
    > creating bean with name 'errorPageFilter': Initialization of bean
    > failed; nested exception is java.lang.ClassCastException:
    > org.springframework.boot.context.web.ErrorPageFilter cannot be cast to
    > org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
    >   at
    > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
    >   at
    > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    >   at
    > org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
    >   at
    > org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    >   at
    > org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
    >   at
    > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    >   at
    > org.springframework.boot.context.embedded.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:209)
    >   at
    > org.springframework.boot.context.embedded.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:165)
    >   at
    > org.springframework.boot.context.embedded.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:160)
    >   at
    > org.springframework.boot.context.embedded.ServletContextInitializerBeans.addAdaptableBeans(ServletContextInitializerBeans.java:143)
    >   at
    > org.springframework.boot.context.embedded.ServletContextInitializerBeans.<init>(ServletContextInitializerBeans.java:74)
    >   at
    > org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getServletContextInitializerBeans(EmbeddedWebApplicationContext.java:234)
    >   at
    > org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.selfInitialize(EmbeddedWebApplicationContext.java:221)
    >   at
    > org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.access$000(EmbeddedWebApplicationContext.java:84)
    >   at
    > org.springframework.boot.context.embedded.EmbeddedWebApplicationContext$1.onStartup(EmbeddedWebApplicationContext.java:206)
    >   at
    > org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:162)
    >   at
    > org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
    >   ... 55 more Caused by: java.lang.ClassCastException:
    > org.springframework.boot.context.web.ErrorPageFilter cannot be cast to
    > org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
    >   at
    > com.futureprocessing.spring.ContainerConfiguration$1.customize(ContainerConfiguration.java:34)
    >   at
    > org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor.postProcessBeforeInitialization(EmbeddedServletContainerCustomizerBeanPostProcessor.java:67)
    >   at
    > org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor.postProcessBeforeInitialization(EmbeddedServletContainerCustomizerBeanPostProcessor.java:54)
    >   at
    > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408)
    >   at
    > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1566)
    >   at
    > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    >   ... 71 more
    > 
    > 12-Dec-2015 14:54:39.321 SEVERE [http-apr-8080-exec-12]
    > org.apache.catalina.startup.HostConfig.deployWAR Error deploying web
    > application archive C:\Tomcat8\webapps\hello-gradle.war 
    > java.lang.IllegalStateException: ContainerBase.addChild: start:
    > org.apache.catalina.LifecycleException: Failed to start component
    > [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/hello-gradle]]
    >   at
    > org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:729)
    >   at
    > org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    >   at
    > org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    >   at
    > org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945)
    >   at
    > org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:466)
    >   at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1583)
    >   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at
    > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    >   at
    > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    >   at java.lang.reflect.Method.invoke(Method.java:497)     at
    > org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    >   at
    > com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    >   at
    > com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    >   at
    > org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1460)
    >   at
    > org.apache.catalina.manager.HTMLManagerServlet.upload(HTMLManagerServlet.java:288)
    >   at
    > org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:209)
    >   at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)     at
    > javax.servlet.http.HttpServlet.service(HttpServlet.java:729)  at
    > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    >   at
    > org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:136)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    >   at
    > org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    >   at
    > org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    >   at
    > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    >   at
    > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    >   at
    > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    >   at
    > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
    >   at
    > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    >   at
    > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    >   at
    > org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    >   at
    > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    >   at
    > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
    >   at
    > org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
    >   at
    > org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
    >   at
    > org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2500)
    >   at
    > org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2489)
    >   at
    > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    >   at
    > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    >   at
    > org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    >   at java.lang.Thread.run(Thread.java:745)
    > 
    > 12-Dec-2015 14:54:39.327 INFO [http-apr-8080-exec-12]
    > org.apache.catalina.startup.HostConfig.deployWAR Deployment of web
    > application archive C:\Tomcat8\webapps\hello-gradle.war has finished
    > in 4,123 ms
    

    It does say that the error occurred in my java file called ContainerConfiguration.java:

    @Configuration
    public class ContainerConfiguration {
    
        @Bean
        EmbeddedServletContainerCustomizer containerCustomizer(
                //all taken from the application.properties file
                @Value("${keystore.file}") String keystoreFile,
                @Value("${server.port}") final String serverPort,
                @Value("${keystore.pass}") final String keystorePass)
                throws Exception {
    
            // This is boiler plate code to setup https on embedded Tomcat
            // with Spring Boot:
    
            final String absoluteKeystoreFile = new File(keystoreFile)
                    .getAbsolutePath();
    
            return new EmbeddedServletContainerCustomizer() {
                @Override
                public void customize(ConfigurableEmbeddedServletContainer container) {
                    TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
                    tomcat.addConnectorCustomizers(connector -> {
                        connector.setPort(Integer.parseInt(serverPort));
                        connector.setSecure(true);
                        connector.setScheme("https");
    
                        Http11NioProtocol proto = (Http11NioProtocol) connector
                                .getProtocolHandler();
                        proto.setSSLEnabled(true);
    
                        proto.setKeystoreFile(absoluteKeystoreFile);
                        proto.setKeystorePass(keystorePass);
                        proto.setKeystoreType("JKS");
                        proto.setKeyAlias("abcd"); 
                    });
                }
            };
        }
    }
    

    The error is on this line:

         tomcat.addConnectorCustomizers(connector -> {
                    connector.setPort(Integer.parseInt(serverPort));
                    connector.setSecure(true);
                    connector.setScheme("https");
    

    I don't get how errorPageFilter is casted to TomcatEmbeddedServletContainerFactory?

    Does anyone know how I can fix this error?

    EDIT:

    I have also create a simple SpringBoot test app to demonstrate this error as well , you can find it here: https://github.com/Winghin2517/testSpringBootTomcat

    There are only two classes in the github repo:

    1. ContainerConfiguration - where the offensive class is sitting.
    2. DemoApplication - the main method sits here

    If you comment out the ContainerConfiguration and build a war file then upload it to a tomcat server, it works perfectly. If you uncomment out the ContainerConfiguration and build the war file and upload it, you will get the error.

    解决方案

    You're trying to customize SSL connections with your customizer. It's 100% legal if you are launching embedded tomcat server. So the flow is the following:

    • you customize tomcat setup
    • you launch the server

    From the JavaDocs of EmbeddedServletContainerCustomizer

    Strategy interface for customizing auto-configured embedded servlet containers. Any beans of this type will get a callback with the container factory before the container itself is started, so you can set the port, address, error pages etc.

    Contrary, you cannot customize any of those things on already running tomcat.

    Imagine what kind of security issues you could face if you had an option to change port / address of already running tomcat with just deploying a war file to it.

    If you really need to customize the ssl connectors you need to go deep into xml configurations of tomcat.

    A great and simple guide can be found here

    这篇关于tomcat上的Spring Boot war文件:errorPageFilter不能转换为TomcatEmbeddedServletContainerFactory的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆