【问题标题】:Set scope of returned instance in custom ELResolver在自定义 ELResolver 中设置返回实例的范围
【发布时间】:2017-01-04 14:52:17
【问题描述】:

我编写了一个自定义 ELResolver,它返回一个会话 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(焊接 2.3.4 最终版)

【问题讨论】:

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


    【解决方案1】:

    好吧,EL 解析器似乎是错误的方法。我现在使用由 faces 上下文 (RequeatMap、SessionMap、ViewMap 和 ApplicationMap) 提供的地图。对象现在已正确释放。 就我而言,我使用自定义 ResourceHandler 并在那里添加相应的 bean。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 2021-05-04
      • 1970-01-01
      相关资源
      最近更新 更多