Spring Boot 2.2.7迁移3.0.0时无法解析jpaSharedEM_entityManagerFactory Bean
一、jpaSharedEM_entityManagerFactory的来源
这个Bean是Spring Data JPA自动生成的共享EntityManager代理,命名规则为jpaSharedEM_<entityManagerFactoryBeanName>。默认情况下,Spring Boot自动配置的EntityManagerFactory Bean名为entityManagerFactory,因此对应的共享EntityManager代理就是jpaSharedEM_entityManagerFactory,它的作用是为JPA Repository提供统一的EntityManager实例,避免重复创建。
在Spring Boot 3.0(基于Spring Framework 6)中,该Bean的生成逻辑、依赖注入规则相比2.x版本有调整,若自定义了JPA相关配置,很容易出现Bean无法被解析的问题。
二、问题解决方法
1. 核对自定义DatabaseConfiguration的配置
如果手动配置了EntityManagerFactory,必须确保配置的一致性:
- 若自定义的EntityManagerFactory Bean名为
customEntityManagerFactory,需要在@EnableJpaRepositories中指定entityManagerFactoryRef参数,与Bean名保持一致:@EnableJpaRepositories( basePackages = "com.your.project.repository", entityManagerFactoryRef = "customEntityManagerFactory" ) @EnableTransactionManagement @EnableJpaAuditing public class DatabaseConfiguration { @Bean(name = "customEntityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) { // 你的数据源、实体扫描等配置逻辑 } } - 若未自定义EntityManagerFactory,不要随意修改
entityManagerFactoryRef,保持默认即可。
2. 检查Repository中EntityManager的注入
如果在Repository中手动注入EntityManager,避免指定错误的名称或unitName:
public interface UserRepository extends JpaRepository<User, Long> { // 仅使用@PersistenceContext,不要指定name属性(除非你明确自定义了EM) @PersistenceContext EntityManager entityManager; }
建议尽量避免在Repository中直接注入EntityManager,优先使用Spring Data JPA的原生查询、自定义方法等方式实现业务逻辑,减少手动依赖。
3. 确认Spring Boot JPA自动配置未被误排除
检查启动类或配置类中是否添加了@EnableAutoConfiguration(exclude = {JpaAutoConfiguration.class}),这类配置会完全禁用Spring Boot的JPA自动配置,导致默认的EntityManagerFactory和对应的共享EM Bean无法生成。若不是完全手动配置JPA,移除该排除项。
可以临时注释掉自定义的DatabaseConfiguration,用默认配置启动项目,排查是否是自定义配置导致的问题。
4. 校验依赖版本兼容性
Spring Boot 3.0要求Java 17+,同时依赖的第三方库版本必须适配:
- MapStruct需使用1.5.3.Final及以上版本
- Lombok需使用1.18.26及以上版本
- SendGrid需使用符合Spring Boot 3.0的版本
推荐通过Spring Boot的依赖管理统一控制版本,避免版本冲突:
<!-- pom.xml示例 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
5. 排查Security依赖链中的Bean管理
从报错的依赖链WebSecurityConfig→jwtTokenProvider→myUserDetails→userRepository检查:
- 确保
MyUserDetails、JwtTokenProvider都被Spring正确管理(添加@Service/@Component注解) - 避免手动实例化这些Bean(比如用
new创建对象),否则Spring无法为其注入依赖 - 检查是否存在循环依赖,可通过Spring Boot启动日志中的循环依赖提示排查
内容的提问来源于stack exchange,提问作者Adrian

