spring-data-jdbc与spring-session-redis无法协同?需额外配置吗?
解决spring-data-jdbc与spring-session-redis协同工作的仓库识别问题
这个问题我之前也碰到过!根源在于引入spring-session-redis后,Spring Data的自动配置机制会因为classpath中同时存在JDBC和Redis的Spring Data组件,而无法自动判断你的ClientRepository应该绑定到哪种存储实现上。单独用spring-data-jdbc时,没有其他存储类型干扰,所以一切正常。
下面是几个可行的解决方案:
1. 给Repository接口明确指定JDBC类型
在你的ClientRepository接口上添加@JdbcRepository注解(Spring Data JDBC 2.0及以上版本支持),直接告诉Spring这是一个JDBC仓库:
import org.springframework.data.jdbc.repository.JdbcRepository; import org.springframework.data.repository.CrudRepository; @JdbcRepository public interface ClientRepository extends CrudRepository<Client, Long> { // 你的自定义方法 }
如果使用较低版本的Spring Data JDBC,可以用@RepositoryDefinition注解替代,指定实体类和ID类型:
import org.springframework.data.repository.RepositoryDefinition; @RepositoryDefinition(domainClass = Client.class, idClass = Long.class) public interface ClientRepository extends CrudRepository<Client, Long> { }
2. 通过配置类明确启用JDBC仓库
在你的配置类上添加@EnableJdbcRepositories注解,指定JDBC仓库的扫描包,同时保留spring-session-redis的@EnableRedisHttpSession注解:
import org.springframework.context.annotation.Configuration; import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; @Configuration @EnableJdbcRepositories(basePackages = "ca.code3.timekeeper.repository") @EnableRedisHttpSession public class DataConfiguration { // 其他配置 }
这个方式会强制Spring扫描指定包下的Repository并将其作为JDBC仓库处理,避免和Redis仓库的自动配置冲突。
3. 确保实体类添加了JDBC映射注解
按照报错提示,给你的Client实体类添加@Table注解,明确和数据库表的映射关系,这能帮助Spring Data更准确地识别JDBC实体:
import org.springframework.data.relational.core.mapping.Table; import org.springframework.data.annotation.Id; @Table("clients") public class Client { @Id private Long id; // 其他字段和 getter/setter }
以上三种方式任选其一,都能解决仓库类型识别的问题,让spring-data-jdbc和spring-session-redis正常协同工作。
内容的提问来源于stack exchange,提问作者benzen
相关产品推荐
相关产品推荐

