You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.2.7迁移3.0.0时无法解析jpaSharedEM_entityManagerFactory Bean

Spring Boot 3.0迁移中jpaSharedEM_entityManagerFactory找不到问题解决

一、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:01:11