【问题标题】:Spring Boot war file on tomcat: errorPageFilter cannot be cast to TomcatEmbeddedServletContainerFactorytomcat 上的 Spring Boot war 文件:errorPageFilter 无法转换为 TomcatEmbeddedServletContainerFactory
【发布时间】:2016-03-18 08:20:19
【问题描述】:

我正在尝试将一个简单的 Spring Boot 应用程序转换为一个 war 文件以部署到我的 tomcat 服务器,但我不断收到此错误:

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

当我将这个 Spring Boot 应用程序作为 jar 运行时,它可以完美运行,但如果我创建了一个战争,它会给我带来错误。据我所知,我完美地遵循了 Spring 指南:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

这是我的应用程序类:

@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);
    }

}

这是我的 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'
}

这是我的 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

它确实说错误发生在我的名为ContainerConfiguration.java的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"); 
                });
            }
        };
    }
}

错误在这一行:

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

我不明白 errorPageFilter 是如何转换为 TomcatEmbeddedServletContainerFactory 的?

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

编辑:

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

github repo 中只有两个类:

  1. ContainerConfiguration - 攻击类所在的位置。
  2. DemoApplication - 主要方法在这里

如果您注释掉 ContainerConfiguration 并构建一个 war 文件,然后将其上传到 tomcat 服务器,它可以完美运行。 如果您取消注释 ContainerConfiguration 并构建 war 文件并上传它,您将收到错误消息。

【问题讨论】:

  • ContainerConfiguration 类的第 34 行出现错误,因为您尝试将 ErrorPageFilter 的实例转换为 TomcatEmbeddedServletContainerFactory
  • 我添加了更多代码供您查看@Andy。
  • 正如您已经说过的:当您使用 JAR 时,它可以完美运行,因为您使用的是嵌入式 Tomcat Servlet 容器。当您尝试部署它时,您尝试配置“外部”Tomcat,但是 - 据我了解 - 它不适用于EmbeddedServletContainerCustomizer。外部容器想要抛出错误并将ErrorPageFilter 作为容器变量传递。您需要在外部 Tomcat 配置中设置所有设置。
  • 你能用代码演示一下吗?如果成功,您可以很高兴地获得 +50 声望。

标签: java spring spring-mvc tomcat gradle


【解决方案1】:

为什么要在外部容器上部署嵌入式 Tomcat?我有类似的问题,最终对我有用的是从项目依赖项中完全排除 tomcat starter。由于spring-boot-starter-tomcatspring-boot-starter-web 的依赖项,因此使用如下内容:

compile ('org.springframework.boot:spring-boot-starter-web') {
    exclude module: 'spring-boot-starter-tomcat'
}

当然,删除显式导入 spring-boot-starter-tomcat 的行(即使在嵌入模式下也不需要)。

如果您希望您的应用能够以两种方式部署,您可能会遇到问题 - 在我的情况下,我不必担心这一点。

【讨论】:

  • 好吧,我在本地使用嵌入式 tomcat 服务器运行 spring boot,因为我不想每次都将其转换为 war 文件并在外部在 tomcat 上运行它。现在,我需要将它作为 webapp 加载到 heroku 上。当我将它转换为战争时,它只是给了我这个错误。但是,是的,多亏了你和 Funtik 的回答,现在它确实有意义了。
【解决方案2】:

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

  • 你自定义tomcat设置
  • 你启动服务器

来自EmbeddedServletContainerCustomizer的JavaDocs

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

相反,您无法在已经运行的 tomcat 上自定义任何这些内容。

想象一下,如果您可以选择更改已经运行的 tomcat 的端口/地址,只需向其部署一个 war 文件,您可能会面临什么样的安全问题。

如果你真的需要自定义 ssl 连接器,你需要深入研究 tomcat 的 xml 配置。

可以在here 找到一个伟大而简单的指南

【讨论】:

  • 好点,我认为你在正确的轨道上 - 你能告诉我我需要做什么来将我的 ContainerConfiguration 转换为外部 tomcat 的 xml 配置代码吗?
  • 添加了指南链接
猜你喜欢
  • 2015-09-16
  • 2015-09-03
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2023-03-19
  • 2016-08-11
相关资源
最近更新 更多