Spring Data仓库自动注入失败:Spring 5.0.6升级后Bean未找到
从你给出的报错信息来看,核心问题是Spring容器找不到com.mmm.arc.dao.UserRepository类型的Bean,导致UserServiceImpl的自动注入失败。下面是几个关键的排查和修复方向:
1. 修正<jpa:repositories>的base-package配置
你的Spring配置里写的是:
<jpa:repositories base-package="repo class package" />
这里的base-package必须指定Repository接口所在的实际包路径——也就是你的UserRepository所在的com.mmm.arc.dao包。修改为:
<jpa:repositories base-package="com.mmm.arc.dao" />
这是最常见的原因:Spring Data JPA根本没扫描到你的Repository接口,自然不会生成代理Bean。
2. 确认依赖版本兼容性与完整性
你使用的Spring 5.0.6和Spring Data JPA 2.0.6(Kay SR6版本)是兼容的,但要检查你的依赖中有没有混入其他版本的Spring/Spring Data组件(比如旧版spring-data-commons),版本冲突可能会破坏Repository的扫描逻辑。同时要确保spring-data-jpa的jar包已正确引入,没有缺失。
3. 解决WebSphere容器下的JPA配置冲突
因为你在WebSphere中使用托管的JPA 2.1,需要确保Spring的EntityManager配置和容器的persistence单元正确衔接:
- 确认
LocalContainerEntityManagerFactoryBean的persistenceUnitName和persistence.xml中定义的单元名称完全一致(包括大小写); - 如果WebSphere已经托管了persistence单元,可以尝试让Spring直接复用容器的EntityManagerFactory,避免组件冲突:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> <property name="persistenceUnitName" value="你的persistence单元名称"/> </bean>
4. 验证Repository定义规范
你的UserRepository继承了JpaRepository、JpaSpecificationExecutor和自定义的UserRepositoryCustom,实现类UserRepositoryImpl的命名也符合Spring Data默认规则(接口名+Impl),这部分是没问题的。但要确保UserRepositoryCustom的方法签名在实现类中完全匹配,避免因方法不匹配导致代理生成失败。
额外调试技巧
可以开启Spring Data的DEBUG日志,查看扫描过程:
<logger name="org.springframework.data.jpa.repository" level="DEBUG"/>
通过日志能明确看到Spring是否扫描到了UserRepository,以及代理Bean的生成细节,方便定位隐藏问题。
内容的提问来源于stack exchange,提问作者yousuf

