如何让一个类继承通过托管bean设置的另一个类的值

时间:2018-05-04 21:02:42

标签: java xpages

我在另一个类中使用一个Java类时遇到了一些麻烦。

对于我的应用程序,我已为实用程序类设置了托管bean:

<managed-bean>
    <managed-bean-name>utilBean</managed-bean-name>
    <managed-bean-class>com.acme.domino.utils.Utils</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
      <property-name>debug</property-name>
      <value>false</value>
      <property-class>java.lang.Boolean</property-class>
    </managed-property>    
    <managed-property>
      <property-name>log</property-name>
      <value>false</value>
      <property-class>java.lang.Boolean</property-class>
    </managed-property>
  </managed-bean>

在这个类中有一个写入日志的方法。

现在我想在另一个类中使用这个类。所以我的想法是将上面的托管bean注入另一个托管bean中。

<managed-bean>
    <managed-bean-name>orderBean</managed-bean-name>
    <managed-bean-class>com.acme.domino.app.Order</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
      <property-name>utils</property-name>
      <value>#{utilsBean}</value>
    </managed-property>
  </managed-bean>

Order类有字段

public Utils utils;
    public Utils getUtils() {
        return utils;
    }

    public void setUtils(Utils utils) {
        this.utils = utils;
    }

但是在构造函数中它已经错了:

public Order() throws Exception {
        super();
        utils = new Utils();

        System.out.println("log?? " + utils.log);
..}

似乎在Utils类的构造函数中,我必须以某种方式设置两个字段:

public Utils() {
        this.debug = true;
        this.log = true;
}

在Utils类中,字段的值为false(通过托管属性设置。

在Orders类中,字段的值为true(通过Utils构造函数设置)。

有没有办法避免在Utils构造函数中设置字段?或者是否要避免在Order类中定义Utils类的新实例?

当我没有在Utils构造函数类中设置字段时,我得到的消息是:

javax.faces.FacesException:无法实例化类:&#39; com.acme.domino.app.orderBean&#39; .. null 无法实例化类:&#39; com.acme.domino.app.orderBean&#39; .. null class com.acme.domino.app.orderBean:java.lang.NullPointerException

我想让我的Order类继承通过Managed Bean设置的Utils类。

2 个答案:

答案 0 :(得分:1)

faces-config.xml中有一个拼写错误。您尝试注入<value>#{utilsBean}</value>,但utilsBean不是正确的引用,utilBean是。没有。那么你以后在构造函数中做的事情就没有必要了。托管bean被称为托管,因为框架在被“调用”时实例化它们。因此,框架将调用Order类的setUtils并传递已根据faces-config.xml定义创建的Utils bean对象。

答案 1 :(得分:0)

而不是:

utils = new Utils();

尝试:

Utils utils = (Utils)ExtLibUtil.resolveVariable(FacesContext.getCurrentInstance(), "utilBean");

从java读取托管bean的更多背景知识: XPages: How to acces an application scope bean from a session scope bean