jakarta-ee - 程序化对话查找

标签 jakarta-ee cdi lookup conversation-scope

是否有可能获得 CDI conversation以编程方式实例只知道当前的 thread是用来处理 CDI request 的与想要的对话相关联?如果可能的话怎么办?

特别是,我想做的是:

@ConversationScoped
public class UnitOfWork {...}

public class Client {
    @Inject transient UnitOfWork uof;
...
}

public class Room {
    @Inject transient UnitOfWork uof;
...
}

但使用编程机制来初始化 uof实例变量而不是应用 @Inject 注释(因为 ClientRoom 是实体,它们不支持注入(inject))。
我已经尝试注入(inject) UnitOfWork通过 BeanManager通过以下静态方法获得:
public static <B> B getManagedBean(Class<B> type, Annotation... qualifiers) {
    try {
        BeanManager beanManager = InitialContext.doLookup("java:comp/BeanManager");
        Set<Bean<?>> beans = beanManager.getBeans(type, qualifiers);
        Bean<B> bean = (Bean<B>) beanManager.resolve(beans);
        CreationalContext<B> cc = beanManager.createCreationalContext(bean);
        return bean.create(cc);
    } catch (NamingException e) {
        throw new RuntimeException("", e);
    }
}

但问题是通过上述方法给出的bean是新的(每次调用都会给出一个新实例),我需要ClientRoom共享 UnitOfWork 的同一个 session 范围实例.

最佳答案

抱歉,这不是一个真正的答案,但在评论中写得太多了:

有原因实体不支持依赖注入(inject) - 主要是因为它们的生命周期与托管 bean 的生命周期是分离的。

虽然我当然在实体中看到了 DI 的用例,但我会加倍(和三倍)检查这种方法的好处是否超过风险。您可能会发现自己在某种二级缓存 hell 中破解持久性上下文;)

关于jakarta-ee - 程序化对话查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12257006/

相关文章:

java - @ApplicationScoped 必须是可序列化的?

java - JBoss AS 7 Bean 查找 EJB

c++ - 字符串数组到 C++ 函数

java - 将 Maven 项目作为依赖项添加到 NetBeans 中的 Java Web 项目

java - 提交表单时出错:Data truncation: Incorrect datetime

servlets - @WebInitParam 有什么意义?

python - Pymongo 聚合多个条件 : lookup, unwind, redact, cond, sort and limit

jakarta-ee - Arquillian - ClassNotFound on org.jboss.arquillian.core.api.threading.ExecutorService

servlets - 带有安全过滤器和依赖注入(inject)的 jax-rs 1.1,如何实现这一点?

java - 有没有办法重新注入(inject)/更新注入(inject)的 bean 字段?