как позволить одному классу наследовать значения от другого класса, настроенного через управляемый компонент - PullRequest
0 голосов
/ 05 мая 2018

Я немного борюсь с использованием одного класса Java в другом классе.

Для моего приложения я настроил управляемый компонент для служебного класса:

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

В этом классе есть метод для записи в журнал.

Теперь я хотел бы использовать этот класс в другом классе. Поэтому я хочу добавить управляемый компонент выше в другой управляемый компонент для другого класса.

<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 значения для полей являются ложными (как установлено через управляемые свойства.

В классе Orders значения для полей являются истинными (как установлено через конструктор Utils).

Есть ли способ избежать установки полей в конструкторе Utils? Или можно избежать определения нового экземпляра класса Utils в классе Order?

Сообщение, которое я получаю, когда не устанавливаю поля в классе конструктора Utils:

javax.faces.FacesException: Не удается создать экземпляр класса: 'com.acme.domino.app.orderBean' .. null Не могу создать экземпляр класса: 'com.acme.domino.app.orderBean' .. null Класс com.acme.domino.app.orderBean: java.lang.NullPointerException

Мне бы хотелось, чтобы мой класс Order наследовал настройки класса Utils, установленные через управляемый компонент.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

В вашем faces-config.xml есть опечатка. Вы пытаетесь ввести <value>#{utilsBean}</value>, но utilsBean не верная ссылка, utilBean. Нет с Тогда то, что вы позже делаете в конструкторе, не нужно. Управляемые bean-компоненты называются управляемыми, потому что инфраструктура создает их в тот момент, когда их «вызывают». Таким образом, среда будет вызывать setUtils класса Order и передавать уже созданный объект компонента Utils в соответствии с вашим определениемface-config.xml.

0 голосов
/ 05 мая 2018

вместо:

utils = new Utils();

попробовать:

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

дополнительная информация о чтении управляемого компонента из Java: XPages: Как получить доступ к компоненту области приложения из компонента области сеанса

...