能否将预初始化EntityManager实例注入SeContainer?非select方式实现
问题描述
现有JUnit测试代码如下,预初始化了静态的EntityManager实例,计划作为OrderRepository(包含@Inject private EntityManager字段)的依赖,但该实例未被注入到SeContainer中,运行时抛出依赖不满足的错误:
测试代码:
import jakarta.enterprise.inject.se.SeContainer; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import jakarta.enterprise.inject.se.SeContainerInitializer; import java.util.HashMap; import java.util.Map; public class OrderRepositoryTest { private static EntityManager entityManager; @BeforeAll public static void init() { Map<String, String> configOverrides = new HashMap<>(); configOverrides.put("jakarta.persistence.validation.mode", "none"); EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("primary-test", configOverrides); entityManager = emFactory.createEntityManager(); } @Test public void test() { SeContainerInitializer init = SeContainerInitializer.newInstance(); init.addBeanClasses(OrderRepository.class); SeContainer c = init.initialize(); OrderRepository sut = c.select(OrderRepository.class).get(); } }
运行时错误:
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type EntityManager with qualifiers @Default
疑问:是否可不使用select方法将该预初始化的EntityManager实例注入SeContainer?若可以,具体如何实现?
解决方案
可以实现,无需依赖select方法手动处理,直接通过SeContainerInitializer的addInstance方法将预初始化的EntityManager实例注册到CDI容器中,容器会自动将其注入到OrderRepository的对应字段里。
修改后的测试代码如下:
import jakarta.enterprise.inject.se.SeContainer; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import jakarta.enterprise.inject.se.SeContainerInitializer; import java.util.HashMap; import java.util.Map; public class OrderRepositoryTest { private static EntityManager entityManager; @BeforeAll public static void init() { Map<String, String> configOverrides = new HashMap<>(); configOverrides.put("jakarta.persistence.validation.mode", "none"); EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("primary-test", configOverrides); entityManager = emFactory.createEntityManager(); } @Test public void test() { SeContainerInitializer init = SeContainerInitializer.newInstance(); // 关键步骤:将预初始化的EntityManager实例注册到CDI容器 init.addInstance(EntityManager.class, entityManager); init.addBeanClasses(OrderRepository.class); SeContainer c = init.initialize(); // 容器会自动注入EntityManager,直接获取实例即可 OrderRepository sut = c.select(OrderRepository.class).get(); // 后续测试逻辑... } }
关键说明
addInstance(EntityManager.class, entityManager):该方法会把已有的EntityManager实例作为CDI容器中的bean注册,类型为EntityManager且带有默认的@Default限定符,完全匹配OrderRepository中@Inject字段的依赖要求。- 注册完成后,从容器获取
OrderRepository实例时,CDI容器会自动完成EntityManager的注入操作,无需手动关联依赖。
内容的提问来源于stack exchange,提问作者Rui
相关产品推荐
相关产品推荐

