@EnableRedisRepositories失效,报Failed to read candidate component class错误
Spring Redis Repository集成报错解决方案
问题现象
在Spring Web应用中尝试通过Spring Repository使用Redis,添加@EnableRedisRepositories注解后抛出如下错误:
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [/Users/nomansadiq/Documents/code-workspace/EHCS-master/target/classes/com/bison/ams/config/RedisConfig.class]; nested exception is java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.springframework.data.redis.repository.configuration.EnableRedisRepositories.repositoryBaseClass() at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:303) ...(省略部分错误栈)
相关代码
Redis配置类
@Configuration @EnableTransactionManagement @ComponentScan({"com.bison.ams.config", "com.bison.ams.persist"}) @EnableRedisRepositories public class RedisConfig { @Autowired ConfigProperties configProp; @Bean JedisConnectionFactory jedisConnectionFactory() { JedisConnectionFactory jedisConFactory = new JedisConnectionFactory(); String host = configProp.getConfigValue("redis.host"); String port = configProp.getConfigValue("redis.port"); jedisConFactory.setHostName(host); jedisConFactory.setPort(Integer.parseInt(port)); return jedisConFactory; } @Bean @Autowired public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(jedisConnectionFactory()); return template; } }
Repository接口
@Repository public interface TagPositionRepo extends CrudRepository<TagPosition, String> { }
实体类
@RedisHash("TagPosition") public class TagPosition implements Serializable { private String id; private Position position; ... }
pom.xml依赖
<properties> <java-version>1.8</java-version> <org.aspectj-version>1.6.10</org.aspectj-version> <jackson.version>1.9.13</jackson.version> <hibernate.validator.version>4.2.0.Final</hibernate.validator.version> <org.springframework-version>4.2.1.RELEASE</org.springframework-version> <!-- <org.springframework-version>4.2.5.RELEASE</org.springframework-version>--> <org.slf4j-version>1.6.6</org.slf4j-version> <springfox-version>2.2.2</springfox-version> </properties> <dependencies> ...(省略其他依赖) <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.8.23.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> <type>jar</type> </dependency> </dependencies>
问题原因
Spring版本与Spring Data Redis版本不兼容:
- Spring Data Redis 1.8.x系列要求Spring Framework版本至少为4.3.x,当前使用的Spring版本4.2.1.RELEASE过低。
@EnableRedisRepositories注解的repositoryBaseClass默认值依赖了Spring 4.3才引入的类,低版本Spring无法解析该注解的默认值,从而抛出AnnotationFormatError。
解决方案
方案1:升级Spring Framework版本
将Spring版本升级到4.3.x及以上(推荐与Spring Data Redis 1.8.23匹配的4.3.30.RELEASE),修改pom.xml中的org.springframework-version:
<org.springframework-version>4.3.30.RELEASE</org.springframework-version>
方案2:降级Spring Data Redis版本
将Spring Data Redis降级到适配Spring 4.2.x的1.7.x系列,比如1.7.23.RELEASE:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.23.RELEASE</version> </dependency>
额外优化建议
- 去掉
redisTemplate()方法上的@Autowired注解:Spring会自动注入方法依赖的Bean,直接调用jedisConnectionFactory()即可,无需额外注入。 - 给
@EnableRedisRepositories指定扫描包路径,减少不必要的类扫描:
@EnableRedisRepositories(basePackages = "com.bison.ams.persist")
内容的提问来源于stack exchange,提问作者user565
相关产品推荐
相关产品推荐

