【问题标题】:Error with Redis Autoconfiguration using Spring Boot 1.3.3 and Spring XD 1.3.1使用 Spring Boot 1.3.3 和 Spring XD 1.3.1 的 Redis 自动配置出错
【发布时间】:2016-04-05 01:33:21
【问题描述】:

我正在尝试创建一个自定义 Spring XD (v1.3.1) 模块并利用一些 Spring Boot Starter 项目,但我遇到了 Redis 错误。

我在这里有一个非常简单的示例项目:https://github.com/fgreg/redis-error-example,它重现了错误。我认为这与我使用的 Spring Boot 版本有关。

基本上,当我尝试运行集成测试时; Spring XD 启动失败,报错:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'redisTemplate' defined in class path resource [org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration$RedisConfiguration.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.springframework.data.redis.connection.RedisConnectionFactory]: : Error creating bean with name 'org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration$RedisPooledConnectionConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected org.springframework.boot.autoconfigure.data.redis.RedisProperties org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration$AbstractRedisConfiguration.properties; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.autoconfigure.data.redis.RedisProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration$RedisPooledConnectionConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected org.springframework.boot.autoconfigure.data.redis.RedisProperties org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration$AbstractRedisConfiguration.properties; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.autoconfigure.data.redis.RedisProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:464)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:139)
    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:129)
    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:129)
    at org.springframework.xd.dirt.server.singlenode.SingleNodeApplication.run(SingleNodeApplication.java:83)
    at com.example.UpperCaseProcessorIntegrationTest.setUp(UpperCaseProcessorIntegrationTest.java:34)
    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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
    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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration$RedisPooledConnectionConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected org.springframework.boot.autoconfigure.data.redis.RedisProperties org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration$AbstractRedisConfiguration.properties; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.autoconfigure.data.redis.RedisProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:368)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
    ... 38 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected org.springframework.boot.autoconfigure.data.redis.RedisProperties org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration$AbstractRedisConfiguration.properties; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.autoconfigure.data.redis.RedisProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
    ... 59 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.autoconfigure.data.redis.RedisProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
    ... 61 more

但是,如果我降级回版本

"org.springframework.boot:spring-boot-starter-integration:1.2.3.RELEASE"

在我的build.gradle 中,一切正常。

我正在浏览 Spring Boot 1.3 release notes,唯一让我印象深刻的是对缓存自动配置(包括 Redis)的新支持。

我假设由于 Spring XD 使用 Redis 进行分析,Spring Boot 会在类路径中查找这些类并尝试配置 Redis。我怎样才能让它停止呢?或者,正确加载我的类路径中spring-xd-dirt-1.3.1.RELEASE.jar 内的application.yaml 文件中存在的redis 配置?

我尝试了以下方法但没有成功:

  • 将@EnableAutoConfiguration(exclude = RedisAutoConfiguration.class) 添加到我的IntegrationConfiguration 班级。我认为它甚至在考虑我的配置类之前就失败了。
  • 从我的依赖项中排除 spring-boot-autoconfigure 模块。这只会导致各种其他故障。
  • 我可以尝试使用spring.autoconfigure.excludes 属性,但我不知道将它放在哪里才能真正起作用。我不能将它作为参数传递给new SingleNodeApplication().run()(它作为未知选项失败)并且当我将它放在spring-module.properties 文件中时它不会被拾取。此外,当我最终开始部署此自定义模块时,我不想将其设置为启动参数,我希望该模块是独立的。

编辑:一些附加信息。对于我的实际项目,我想使用 Spring Boot 1.3 因为added support for Cassandra。

【问题讨论】:

    标签: java spring spring-boot spring-integration spring-xd


    【解决方案1】:

    我仔细查看了我的依赖项,发现:

    compile - Compile classpath for source set 'main'.
    +--- org.springframework.boot:spring-boot-starter-integration:1.3.3.RELEASE
    |    +--- org.springframework.boot:spring-boot-starter:1.3.3.RELEASE
    |    |    +--- org.springframework.boot:spring-boot:1.3.3.RELEASE
    |    |    |    +--- org.springframework:spring-core:4.2.5.RELEASE
    |    |    |    |    \--- commons-logging:commons-logging:1.2
    |    |    |    \--- org.springframework:spring-context:4.2.5.RELEASE
    |    |    |         +--- org.springframework:spring-aop:4.2.5.RELEASE
    |    |    |         |    +--- aopalliance:aopalliance:1.0
    |    |    |         |    +--- org.springframework:spring-beans:4.2.5.RELEASE
    |    |    |         |    |    \--- org.springframework:spring-core:4.2.5.RELEASE (*)
    |    |    |         |    \--- org.springframework:spring-core:4.2.5.RELEASE (*)
    |    |    |         +--- org.springframework:spring-beans:4.2.5.RELEASE (*)
    |    |    |         +--- org.springframework:spring-core:4.2.5.RELEASE (*)
    |    |    |         \--- org.springframework:spring-expression:4.2.5.RELEASE
    |    |    |              \--- org.springframework:spring-core:4.2.5.RELEASE (*)
    |    |    +--- org.springframework.boot:spring-boot-autoconfigure:1.3.3.RELEASE <-------
    |    |    |    \--- org.springframework.boot:spring-boot:1.3.3.RELEASE (*)             |
                                                                                           |
                                                                   notice the 1.3.3 here----
    ...
    
    
    provided
    \--- org.springframework.xd:spring-xd-dirt:1.3.1.RELEASE
         ...
         +--- org.springframework.boot:spring-boot-autoconfigure:1.2.3.RELEASE <-----------
         |    +--- org.springframework.boot:spring-boot:1.2.3.RELEASE                     |
                                                                                          |
                                                                                          |
                                                                     and the 1.2.3 here----
    

    果然,我查看了运行时类路径,它包含 Spring Boot 的 1.2.3 和 1.3.3 版本。所以看起来由于 XD DiRT 使用 Spring boot v1.2.3,我不能/不应该使用 v1.3.3。

    我的解决方案似乎是,不要使用 Spring Boot。

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 2017-07-06
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 2016-08-31
      相关资源
      最近更新 更多