防止托管Bean被多次实例化

时间:2015-04-09 19:53:24

标签: java xpages managed-bean

我是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类中调用它,另一次是在我添加上面的标签时。

在我的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>

2 个答案:

答案 0 :(得分:4)

请考虑以下三点:

  1. 尝试将“id”属性添加到托管bean开始标记,其名称与managed-bean-name相同。 这可能不是您的问题,但这是我们设置它的方式。
  2. 示例:

    <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(Plain Old Java Object),而不是托管bean。这样您就可以在需要时创建对象。你不会再在faces-config中有一个条目了,你需要在创建它时使用'new'关键字。当引用变为null时,垃圾收集将清理它。

答案 1 :(得分:0)

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

  

Thread [Thread-7](Suspended(ApplicationController中第131行的断点))
      ApplicationController。()行:131
      J9VMInternals.newInstanceImpl(Class)行:不可用[native method]
      Class.newInstance()行:1688

     
    

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

         
      

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

    
  

在我看来,IBM无法实现同步的应用程序,视图或会话范围变量,甚至认为它们&lt; sarcasm&gt;已经有&lt; / sarcasm&gt; JAVA 1.6

http://www-01.ibm.com/support/docview.wss?uid=swg21188789 已经想知道这个链接有多长时间了......

请将种族条件视为真实情况,例如:为实现目标。

相关问题