防止托管 Bean 被多次实例化

Prevent Managed Bean From Being Instantiated Multiple Times

我是 Java 的新手,如果我的术语不正确,请见谅。

我有一个托管 bean 设置 (PolicyInformation),它有一个会话范围,我在我的 Java 代码中实例化了:

thisPolicy = (PolicyInformation) Utils.getSessionMapValue("policyInformationBean");
if (thisPolicy == null) {
    thisPolicy = new PolicyInformation();
}

上面的代码检查bean 是否已经存在,如果存在,它使用会话映射中的对象。感觉效果不错。

但是,如果我使用以下代码(使用表达式语言)在我的 XPage 上添加标签以显示来自我的 PolicyInformation 托管 bean 的值:

<xp:label value="#{policyInformationBean.name}"/>

托管 bean 运行两次:一次是在我的 Java class 中调用它,一次是在我添加上面的标签时。

在我的 XPage 上添加标签时,有什么方法可以阻止第二次调用吗?我能否以某种方式从我的 XPage 标签中的 Java 会话映射中获取值?

面孔配置:

<managed-bean>
<managed-bean-name>policyInformationBean</managed-bean-name>
<managed-bean-scope>session</managed-bean-scope>
<managed-bean-class>com.package.PolicyInformation</managed-bean-class>
</managed-bean>

请考虑以下三点:

  1. 尝试将 "id" 属性 添加到您的托管 bean 开始标记中,并使用与您的托管 bean 名称相同的名称。 这可能不是您的问题,但我们就是这样设置的。

示例:

<managed-bean id="dBar">
<managed-bean-name>dBar</managed-bean-name>
<managed-bean-class>eu.linqed.debugtoolbar.DebugToolbar</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope> 
</managed-bean>
  1. 删除所有创建新 PolicyInformation 对象的代码。要进行管理,您必须始终让框架管理器进行管理。我想你可能会混淆它,创建另一个对象。

  2. 或者,您可以将此 bean 设为 POJO(普通旧 Java 对象)而不是托管 bean。这样您就可以在需要时创建对象。您将不再在 faces-config 中有条目,并且在需要创建它时可以使用 'new' 关键字。当引用变为 null 时,垃圾回收将清理它。

IBM 的任何人,请查看以下内容类:

Thread [Thread-7] (Suspended (breakpoint at line 131 in ApplicationController))
ApplicationController.() line: 131
J9VMInternals.newInstanceImpl(Class) line: not available [native method]
Class.newInstance() line: 1688

Beans.instantiate(ClassLoader, String, BeanContext, AppletInitializer) line: 189
Beans.instantiate(ClassLoader, String) line: 80 ManagedBeanFactory.run() line: 222
AccessController.doPrivileged(PrivilegedExceptionAction) line: 413
ManagedBeanFactory.newInstance(FacesContext) line: 216
ApplicationAssociate.createAndMaybeStoreManagedBeans(FacesContext, String) line: 269

VariableResolverImpl.resolveVariable(FacesContext, String) line: 135 VariableResolverImpl.resolveVariable(FacesContext, String) line: 71

在我看来,IBM 无法实例化同步的应用程序、视图或会话范围的变量,甚至认为它们 allready have JAVA 1.6

http://www-01.ibm.com/support/docview.wss?uid=swg21188789 一直在想这个 link 能用多久...

请将竞争条件视为真实事物,例如用于实例化。