gpt4 book ai didi

jsf-2 - 仅获取服务中的 CDI 托管 bean

转载 作者:行者123 更新时间:2023-12-04 14:45:52 28 4
gpt4 key购买 nike

我的目标是从 JSF2 ExceptionHandlerWrapper 中获取所有服务中 CDI 托管 bean(某个父类的)的集合。请注意,异常处理程序部分很重要,因为该类本身不是有效的注入(inject)目标。所以我的假设(可能不正确)是我唯一的路线是通过 BeanManager 进行编程。

使用 BeanManager.getBeans,我可以成功获取所有可用于注入(inject)的 bean 的集合。我的问题是,当使用 BeanManager.getReference 获取 bean 的上下文实例时,如果 bean 尚不存在,则会创建它。所以我正在寻找一种只返回实例化 bean 的替代方案。下面的代码是我的起点

public List<Object> getAllWeldBeans() throws NamingException {
//Get the Weld BeanManager
InitialContext initialContext = new InitialContext();
BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager");

//List all CDI Managed Beans and their EL-accessible name
Set<Bean<?>> beans = bm.getBeans(AbstractBean.class, new AnnotationLiteral<Any>() {});
List<Object> beanInstances = new ArrayList<Object>();

for (Bean bean : beans) {
CreationalContext cc = bm.createCreationalContext(bean);
//Instantiates bean if not already in-service (undesirable)
Object beanInstance = bm.getReference(bean, bean.getBeanClass(), cc);
beanInstances.add(beanInstance);
}

return beanInstances;
}

最佳答案

在这里,我们...翻阅我找到的 javadoc Context它有两个版本的 bean 实例的 get() 方法。其中之一,当传入创建上下文时,具有与 BeanManager.getReference() 相同的行为。然而,另一个只接受一个 Bean 引用并返回上下文实例(如果可用)或 null。

利用这一点,这里是仅返回实例化 bean 的原始方法的版本:

public List<Object> getAllCDIBeans() throws NamingException {
//Get the BeanManager via JNDI
InitialContext initialContext = new InitialContext();
BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager");

//Get all CDI Managed Bean types
Set<Bean<?>> beans = bm.getBeans(Object.class, new AnnotationLiteral<Any>() {});
List<Object> beanInstances = new ArrayList<Object>();

for (Bean bean : beans) {
CreationalContext cc = bm.createCreationalContext(bean);
//Get a reference to the Context for the scope of the Bean
Context beanScopeContext = bm.getContext(bean.getScope());
//Get a reference to the instantiated bean, or null if none exists
Object beanInstance = beanScopeContext.get(bean);
if(beanInstance != null){
beanInstances.add(beanInstance);
}
}

return beanInstances;
}

关于jsf-2 - 仅获取服务中的 CDI 托管 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20005982/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com