在自定义ELResolver

时间:2016-08-28 13:08:55

标签: el jsf-2.2 java-ee-7

我写了一个自定义的ELResolver,它返回一个Session Bean的实例。我通过JNDI查找一个bean。 getValue方法如下所示:

@Override
public Object getValue(ELContext ctx, Object base, Object prop) {

    if (null == base) {
        Object bean = resolveBean((String) prop);
        if (null != bean) {
            ctx.setPropertyResolved(true);
            return bean;
        }
    }
    return null;
}    

private Object resolveBean(String beanName) {

    \\Search in a RegistryService if such an bean exists

    for (ModulDescriptor md : loader.getDescriptors()) {
        for (MenuItem mi : md.getMenuItems()) {
            if (mi.getElBeanName().equals(beanName)) {
                Object bean = null;
                try {

      \\If exists lookup and return

                    bean = InitialContext.doLookup("java:global/ModulA/" + mi.getJndiBeanName());
                } catch (NamingException e) {
                    e.printStackTrace();
                }

                return bean;
            }
        }
    }

    return null;
}

到目前为止,此工作正常。现在我的问题:

似乎它确定了向查找的bean设置范围的事项。它的作用总是像SessionScope bean。

有没有办法将范围设置为这样的构造? (例如RequestScope或ViewScope)

自定义ELResolver返回的元素的“默认范围”是什么?它只是保存在SessionMap中吗?

版本堆栈:

Oracle JDK 1.8.0_91 x64

Java EE 7(Wildfly 10)

基于Mojarra的JSF 2.2

EJB 3.2

CDI 1.2(Weld 2.3.4 Final)

1 个答案:

答案 0 :(得分:0)

好吧,EL解析器似乎是错误的方法。我现在使用faces context(RequeatMap,SessionMap,ViewMap和ApplicationMap)提供的地图。现在可以正确释放对象。 在我的例子中,我使用自定义ResourceHandler并在那里添加相应的bean。

如果有人需要代码示例,请不要犹豫。