Изменение face-config.xml с 2.2 на 2.3 вызывает javax.el.PropertyNotFoundException: Target Unreachable, идентификатор 'bean' разрешен в null
Есть следующие фрагменты кода:
Боб:
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@Named(value = "directoryBean")
@ViewScoped
public class DirectoryBean implements Serializable {
private static final long serialVersionUID = 1L;
....
}
Лица-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd"
version="2.3">
....
</faces-config>
group.xhtml
<ui:composition ...>
<f:metadata>
<f:viewParam name="id" value="#{directoryBean.id}" />
</f:metadata>
</ui:composition>
В результате получается исключение:
javax.el.PropertyNotFoundException: /group.xhtml @6,64 value="#{directoryBean.id}": Target Unreachable, identifier 'directoryBean' resolved to null
Получил после изменения синтаксиса face-config.xml с версии 2.2 на версию 2.3.
Это значит, что с face-config.xml со следующим содержимым все работает нормально:
<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
....
</faces-config>
JSF 2.3.2 развернут на сервере Payara 4.1.2.172 (Full), а также добавлен в pom.xml с "предоставленной" областью действия.
....
<dependencies>
...
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.3.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>javax.faces-api</artifactId>
<version>2.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
...
</dependencies>
....
Я проверил все решения, которые мне удалось найти в течение нескольких часов, включая разные версии beans.xml:
- изначально beans.xml не присутствовал в проекте - проблема сохраняется;
- добавлен пустой beans.xml - проблема сохраняется;
- добавлен beans.xml с двумя различными опциями режима bean-discovery-mode - "all" и "annotated" - проблема сохраняется;
Содержимое \WEB-INF\beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>
Протестировано на локальных экземплярах Payara 4.1.2.172, GlassFish 5 (версия java 1.8.0_144) и на удаленном экземпляре Payara 4.1.2.172 (версия 1.8.0_131 java).
Спасибо!
Примечание. Примеры проектов, подобных этому https://github.com/AnghelLeonard/JSF-2.3/tree/master/JSF23InjectInConverterValidator выдают ту же ошибку.
3 ответа
Я хотел бы опубликовать полное решение, что нужно сделать, чтобы JSF 2.3 libs работал в режиме JSF v2.3. Приведенные ниже примеры кода основаны на серверной среде GlassFish 5.0.
1) Обновите JSF libs до версии 2.3.3 (исправлено несколько ошибок, связанных с активацией режима jsf 2.3)
2) beans.xml
должен выглядеть так:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
bean-discovery-mode="all" version="2.0">
</beans>
3) faces-config.xml
должен выглядеть так:
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.3"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd">
....
</faces-config>
4) И ключевой проигрыватель во всех этих настройках - это специально сформированный класс Java, который фактически активирует режим JSF 2.3, в моем случае он имеет название Jsf23Activator
и абсолютно пустой контент:
package ua.local.beans;
import javax.enterprise.context.ApplicationScoped;
import javax.faces.annotation.FacesConfig;
@ApplicationScoped
@FacesConfig(version = FacesConfig.Version.JSF_2_3)
public class Jsf23Activator {
}
Аннотация @FacesConfig(version = FacesConfig.Version.JSF_2_3)
добавляется один раз для каждого проекта, нет необходимости добавлять его несколько раз.
По сути, необходимость добавления этой аннотации несколько раз упоминалась другими, но в моем случае она не работала, пока я не объявил этот класс как компонент CDI, добавив аннотацию @ApplicationScoped
, Только после того, как я объявил класс как компонент CDI, очистил проект / перезапустил сервер - режим JSF 2.3 наконец-то активировался, и теперь я могу вводить классы JSF / использовать другие функции JSF 2.3!
Спасибо!
У меня была эта проблема, потому что после обновления JSF у меня все еще была эта банка в моем пути к классам:
el-impl-2.1.2.jar
После удаления этого проблема исчезла.
В DirectoryBean добавьте эту строку:
// Activates CDI build-in beans
@FacesConfig(
version = JSF_2_3
)
и в beans.xml измените bean-discovery-mode на "all". Face-config.xml установить версию 2.3
Решение 2:
перейти на Payara 5.183, работает из коробки. Нет необходимости в решении 1: Jsf23Activator