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

how to let one class inherit values from another class set up via managed bean

我在另一个 class.

中使用一个 Java class 有点费力

对于我的应用程序,我已经为实用程序设置了一个托管 bean class:

<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>

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

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

的另一个托管 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>

订单 class 具有字段

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 的构造函数中 class 我必须以某种方式设置这两个字段:

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

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

在订单 class 中,字段的值为真(通过 Utils 构造函数设置)。

有没有办法避免在 Utils 构造函数中设置字段?或者是否可以避免在订单 class?

中定义 Utils class 的新实例

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

javax.faces.FacesException: 无法实例化 class: 'com.acme.domino.app.orderBean'.. null 无法实例化 class: 'com.acme.domino.app.orderBean'.. null class com.acme.domino.app.orderBean : java.lang.NullPointerException

我想让我的订单 class 继承通过托管 Bean 设置的 Utils class 的设置。

而不是:

utils = new Utils();

尝试:

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

有关从 java 读取托管 bean 的更多背景信息:

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