【问题标题】:Spring Data Redis NoSuchBeanDefinitionException: No qualifying bean of typeSpring Data Redis NoSuchBeanDefinitionException:没有类型的限定bean
【发布时间】:2016-11-17 21:13:33
【问题描述】:

当我尝试从 Spring Data Redis 注入实现 CrudRepository 的存储库时,我得到 NoSuchBeanDefinitionException。

原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [bluh.bluh.repository.XxxRepository] ​​的合格 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

无论配置如何,它都使用 @EnableRedisRepositories("bluh.bluh.repository")

进行注释
@Configuration
@EnableRedisRepositories
public class ApplicationConfig {

    @Bean
    RedisConnectionFactory connectionFactory() {
        return new JedisConnectionFactory();
    }

    @Bean
    RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory connectionFactory) {

        RedisTemplate<byte[], byte[]> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);

        return template;
    }

}

存储库界面如下:

import org.springframework.data.repository.CrudRepository;

public interface XxxRepository extends CrudRepository<String, String> { }

我经历过http://docs.spring.io/spring-data/redis/docs/current/reference/html/,对我来说没有什么新鲜事。我想知道我错过了什么,我将不胜感激。

我使用 Spring Data Redis 1.7.2.RELEASE、Spring Boot 1.3.6.RELEASE

【问题讨论】:

  • 没有符合条件的 bean 类型...什么类型的?您可以发布完整的异常消息吗?
  • Spring Data Redis 存储库仅适用于复杂类型。您的存储库将 String 声明为域类。使用 String 标识符是可以的。通常的声明类似于interface XxxRepository extends CrudRepository&lt;Xxx, String&gt; { }interface PersonRepository extends CrudRepository&lt;Person, String&gt; { }。这就是你没有创建 bean 的原因。
  • 不。复杂类型也会发生同样的事情。果然我试过xxx。我的 Xxx 看起来像 @RedisHash("xxx") public class Xxx { @Id private String xxxId; }
  • 你能提供一个可重现的测试用例吗? Gist 还是 Github 存储库?

标签: java spring spring-data-redis


【解决方案1】:

有点晚了,但对于遇到此问题的其他人:

我只是坐着用这个拉头发。下载了 GIT 示例,发现实体被 @RedisHash("hash_name_here") 注释:

@RedisHash("MyDataThingies")
public class MyDataThingy{
    @Id
    public String id
}

现在它有连接问题,但我知道原因:)

【讨论】:

  • 我在我自己的项目中遇到了同样的问题...@RedisHash 注释是唯一缺少的吗?我还在使用休眠来实例化其他存储库......我在想也许有 2 个存储库加载器可能会让框架感到困惑?我遇到的问题是,我的控制器似乎在我的 spring 相关 bean 及其依赖项之前被实例化。
  • 没关系,我想我发现了我的问题......这似乎是一个版本问题。我在使用 spring boot 1.3.8 并且正在将 spring-data-redis 作为依赖项引入(存储库功能是 spring-data-redis 的 1.7.x 版本功能,而 spring-boot 1.3.8 仅带有 v 1.6 .5 的 spring-data-redis)。 Spring boot 1.4.0 有一个 spring-data-redis 启动器,它自动引入 1.7.5 的 spring-data-redis,当我用这些版本配置上面的示例时,我的应用程序工作了。因此,如果您想使用 redis 存储库,请确保您使用的是 spring boot 1.4.+!
【解决方案2】:

我遇到了同样的问题,并意识到这是一个版本问题。

我使用的是 spring-boot v1.3.8,并将 spring-data-redis v1.7.5 作为依赖项引入。尝试使用这些版本自动装配 spring-data-redis 存储库时,我收到了上述问题中发布的错误。

我尝试升级到 spring-boot v.1.4.2。这个版本的 spring-boot 附带了一个名为“spring-boot-starter-data-redis”的启动器,它下拉了 spring-data-redis v1.7.5 和 jedis v2.8.2。我按照文档中提供的相同配置,终于让它工作了!

我猜 spring-boot v1.3.8 和 spring-data-redis v1.7.x 存在一些兼容性问题。这在一定程度上得到了证实,因为 spring-boot 1.3.8 附带了一个名为 spring-boot-starter-redis 的启动器,它下拉了 spring-data-redis 的 v1.6.5。由于 @EnableRedisRepositories 注释仅包含在 1.7.+ 中,看起来需要升级才能使存储库功能正常工作。

tl;dr 尝试将 spring boot 升级到 version.latest,并从 spring-boot-starter-data-redis 中拉入 spring-data-redis。

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。就我而言,版本不是问题,但注释需要明确的basePackages,如下所示:

    @EnableRedisRepositories(basePackages = "my.base.pkg")

    • 使用 springboot - 1.5.11 和 spring-data-redis-1.8.11

    【讨论】:

      猜你喜欢
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      相关资源
      最近更新 更多