Инициализированный бин области применения jsf 2 fron face-config.xml

Я хотел бы инициализировать свойства bean-компонента (области приложения) из face-config.xml. Я пробовал разные конфигурации без успеха. На уровне библиотеки я использую jsf 2.2 - jboss-jsf-api_2.2_spec.jar. На уровне проекта Face-Config настроен на версию 2.0. Я не знаю, в этом ли проблема. JBDS 7 не позволяет мне перейти на 2.2 из-за конфликта с другими аспектами проекта.

Это лица-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">      
    <managed-bean>
        <managed-bean-name>appBean</managed-bean-name>
        <managed-bean-class>package.ApplicationBean</managed-bean-class>
        <managed-bean-scope>application</managed-bean-scope>
        <managed-property>
            <property-name>cookieNameLocale</property-name>
            <property-class>java.lang.String</property-class>
            <value>someText</value>
        </managed-property>
        <managed-property>
            <property-name>debug</property-name>
            <property-class>boolean</property-class>
            <value>true</value>
        </managed-property>
    </managed-bean>
    <application>
        <locale-config>
            <default-locale>xx_XX</default-locale>
            <supported-locale>xx_XX</supported-locale>
        </locale-config>
        <resource-bundle>
            <base-name>locale</base-name>
            <var>i18n</var>
        </resource-bundle>
     </application>
</faces-config>

Это бин области применения:

public class ApplicationBean implements Serializable {

    private boolean debug;
    private String cookieNameLocale;

    //respectively getters and setters
}

Когда @Inject appBean в другой сессионный компонент области видимости, свойства не инициализируются. Нет ошибок, и appBean создается перед сессионным компонентом (используя @PostConstruct для печати)

1 ответ

Решение

<managed-bean> вход в faces-config.xml в основном объявляет новый @ManagedBean, Т.е. управляемый компонент JSF. Однако с @Inject вы в основном вводите управляемый компонент CDI.

Это два взаимоисключающих способа управления компонентами. По сути, вы получаете 2 экземпляра одного и того же класса бинов, один из которых управляется JSF через faces-config.xml и еще один, управляемый CDI с помощью аннотаций. Только те, которыми управляет JSF, имеют эти свойства.

У вас есть 2 варианта:

  1. использование @ManagedProperty внедрить его как управляемый компонент JSF. Однако это, в свою очередь, требует, чтобы акцептор сам по себе был также управляемым компонентом JSF.

  2. Забудь faces-config.xml подход в целом. Определите их как ресурсы JNDI в любом web.xml или сервер конфигурации и использования @Resource вводить их. Или определите их как .properties настройки файла или <context-param> записи в web.xml, CDI не предлагает способов, позволяющих внедрить их, но возможно создать пользовательскую аннотацию с помощью CDI Producer для этого.

Другие вопросы по тегам