由于 "Injection of autowired dependencies failed",无法启动嵌入式 Tomcat

Unable to start embedded Tomcat due to "Injection of autowired dependencies failed"

我是 Java 的新手,目前负责管理一个新应用程序。我正在尝试启动应用程序,但失败并出现以下错误:

Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
        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.SpringApplication.run(SpringApplication.java:967)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:956)
        at com.thinkbiganalytics.controller.Application.main(Application.java:53)
Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:98)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.<init>(TomcatEmbeddedServletContainer.java:75)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:378)
        at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:155)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:157)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
        ... 7 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.setFilterChainProxySecurityConfigurer(org.springframework.security.config.annotation.ObjectPostProcessor,java.util.List) throws java.lang.Exception; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'formBasedWebSecurityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.security.authentication.AuthenticationProvider com.thinkbiganalytics.auth.FormBasedWebSecurityConfiguration.authenticationProvider; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationProvider': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.thinkbiganalytics.auth.AuthenticationService com.thinkbiganalytics.auth.AuthServiceAuthenticationProvider.authenticationService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.thinkbiganalytics.datalake.podium.restclient.PodiumRestClient com.thinkbiganalytics.datalake.podium.auth.PodiumAuthenticationService.podiumRestClient; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'podiumRestClientImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private boolean com.thinkbiganalytics.datalake.podium.restclient.PodiumRestClientImpl.useHttps; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${podium.useHttps}]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)

TL;DR:阅读 Spring 给你的错误。

让我们找出错误并系统地解决它:

Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
            at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
            at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
            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.SpringApplication.run(SpringApplication.java:967)
            at org.springframework.boot.SpringApplication.run(SpringApplication.java:956)
            at com.thinkbiganalytics.controller.Application.main(Application.java:53)
    Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
            at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:98)
            at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.<init>(TomcatEmbeddedServletContainer.java:75)
            at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:378)
            at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:155)
            at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:157)
            at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130)
            ... 7 more
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.setFilterChainProxySecurityConfigurer(org.springframework.security.config.annotation.ObjectPostProcessor,java.util.List) throws java.lang.Exception; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'formBasedWebSecurityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.security.authentication.AuthenticationProvider com.thinkbiganalytics.auth.FormBasedWebSecurityConfiguration.authenticationProvider; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationProvider': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.thinkbiganalytics.auth.AuthenticationService com.thinkbiganalytics.auth.AuthServiceAuthenticationProvider.authenticationService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.thinkbiganalytics.datalake.podium.restclient.PodiumRestClient com.thinkbiganalytics.datalake.podium.auth.PodiumAuthenticationService.podiumRestClient; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'podiumRestClientImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private boolean com.thinkbiganalytics.datalake.podium.restclient.PodiumRestClientImpl.useHttps; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${podium.useHttps}]
            at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)

首先我们有 Exception in thread "main" - 除了由于 "Unable to start embedded container".

而导致状态爆炸外,这并没有告诉我们任何信息

好的,是什么原因造成的,让我们进入下一个阶段:

Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat

好吧,没有更多了。让我们进入下一个阶段:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Injection of autowired dependencies failed

好的,现在我们取得了进展 - 由于自动装配问题,我们无法创建 WebSecurityConfiguration,但那是什么问题?

Could not autowire method: public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.setFilterChainProxySecurityConfigurer(org.springframework.security.config.annotation.ObjectPostProcessor,java.util.List)

啊,好吧,Spring 无法自动装配该方法,为什么不呢?

nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'formBasedWebSecurityConfiguration'

啊,好吧 - 所以它不能自动装配那个方法它不能创建一个 formBasedWebSecurityConfiguration。为什么不?

Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.security.authentication.AuthenticationProvider

啊,没有 AuthenticationProvider。为什么不呢?

Could not autowire field: private com.thinkbiganalytics.auth.AuthenticationService com.thinkbiganalytics.auth.AuthServiceAuthenticationProvider.authenticationService

啊,没有 authenticationService。为什么不呢?

Could not autowire field: com.thinkbiganalytics.datalake.podium.restclient.PodiumRestClient

啊,没有 PodiumRestClient。为什么不呢?

Could not autowire field: private boolean com.thinkbiganalytics.datalake.podium.restclient.PodiumRestClientImpl.useHttps

好的,它无法创建 PodiumRestClientImpl,因为它无法自动装配 boolean useHttps。为什么不呢?

Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${podium.useHttps}]

因此它无法自动装配 PodiumRestClientImpl.useHttps,因为它无法将值为 ${podium.useHttps}String 转换为 boolean。很公平。

因此,似乎您在自动装配配置值时没有正确使用 SpEL,或者您没有配置 PropertySource 来将占位符解析为配置值。