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

能否将预初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:43:19