jsf – 如何在当前视图(范围)中找到/的CDI bean?


Java EE 6,CDI 1.1.x,Seam 3等环境中,我们需要查找当前视图的所有CDI bean(@ViewScoped).我到目前为止尝试使用的是:

@Named
@ViewScoped
public class ViewHelper
{
    @Inject
    private BeanManager beanManager;

    public doSomethingWithTheBeanInstances()
    {
        Set<Bean<?>> beans = this.getBeanManager().getBeans( 
            Object.class, new AnnotationLiteral<Any>(){}
        );

        // do something
        ...
    }
}

但是,这会返回它管理的所有bean.

我只需要找到当前视图范围内的那些 – 这将是理想的 – 只有那些实现特定接口(通过多个层次结构级别继承).

这样做的方法是什么?

注意,由于CDI没有视图范围,我们使用Seam 3来注释所有视图范围的bean,如:

@Named
@ViewScoped
public class ResultManagerColumnHandler extends BaseColumnHandler
{
    ....
}

上面是一个要查找的实例(@ViewScoped是Seam 3的CDI替换).

怎么做到呢?

最佳答案 我对Seam不熟悉,但从CDI的角度来看,这就是我想要的.但是,它认为bean只会在beanManager.getContext(ViewScoped.class);为您返回一个有效的上下文实例:

@Inject
BeanManager bm;

public List<Object> getAllViewScoped() {
    List<Object> allBeans = new ArrayList<Object>();
    Set<Bean<?>> beans = bm.getBeans(Object.class);
    // NOTE - context has to be active when you try this
    Context context = bm.getContext(ViewScoped.class);

    for (Bean<?> bean : beans) {
        Object instance = context.get(bean);
        if (instance != null) {
            allBeans.add(instance);
        }
    }

    return allBeans;
}

您还要求仅获取实现特定接口的bean.为此,只需修改代码行,检索所需类型的所有bean:

Set<Bean<?>> beans = bm.getBeans(MyInterface.class);
点赞