将 faces-config.xml 从 2.2 更改为 2.3 导致 javax.el.PropertyNotFoundException:目标无法到达,标识符 'bean' 解析为空
Changing faces-config.xml from 2.2 to 2.3 causes javax.el.PropertyNotFoundException: Target Unreachable, identifier 'bean' resolved to 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
更改面孔后得到它-config.xml 从 ver 2.2 到 ver 2.3 语法。
意思是,faces-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(完整)服务器上,并且还添加到 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”
和“注释”-问题仍然存在;
\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(java 1.8 版)的远程实例上进行了测试。 0_131).
谢谢!
注意:像这样的示例项目 https://github.com/AnghelLeonard/JSF-2.3/tree/master/JSF23InjectInConverterValidator 会出现同样的错误。
===
2022-03-31 更新:
在 Payara 5.2022.1 上收到与此问题相关的另一个错误:
org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408: Unsatisfied dependencies for type UIViewRoot with qualifiers @Default
因此,即使在最新版本的 Payara JSF 2.3 上,默认情况下也未启用,正如下面的评论之一所述。
在此处添加它以获得更好的搜索可见性。 :)
在 DirectoryBean 中添加此行:
// Activates CDI build-in beans
@FacesConfig(
version = JSF_2_3
)
并在 beans.xml 中将 bean-discovery-mode 更改为 "all"。 faces-config.xml 设置版本 2.3
我想要 post 一个完整的解决方案,应该怎样做才能使 JSF 2.3 库在 JSF v2.3 模式下工作。以下代码示例基于 GlassFish 5.0 服务器环境。
1) 至少将 JSF 库升级到 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 class,它实际上激活了 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)
每个项目添加一次,无需多次添加。
基本上其他人多次提到需要添加此注释,但在我的情况下它不起作用,直到我通过添加注释 @ApplicationScoped
将此 class 声明为 CDI bean。只有在我将 class 声明为 CDI bean、清除项目/重新启动服务器后 - JSF 2.3 模式终于被激活,现在我能够注入 JSF classes / 利用其他 JSF 2.3 功能!
解决方案 2:
切换到 Payara 5.183,开箱即用。不需要方案一:Jsf23Activator
我遇到了这个问题,因为在更新 JSF 之后,我的类路径中仍然有这个 jar:
el-impl-2.1.2.jar
删除这个后问题就消失了。
有以下代码片段:
豆子:
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
更改面孔后得到它-config.xml 从 ver 2.2 到 ver 2.3 语法。
意思是,faces-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(完整)服务器上,并且还添加到 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” 和“注释”-问题仍然存在;
\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(java 1.8 版)的远程实例上进行了测试。 0_131).
谢谢!
注意:像这样的示例项目 https://github.com/AnghelLeonard/JSF-2.3/tree/master/JSF23InjectInConverterValidator 会出现同样的错误。
===
2022-03-31 更新:
在 Payara 5.2022.1 上收到与此问题相关的另一个错误:
org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408: Unsatisfied dependencies for type UIViewRoot with qualifiers @Default
因此,即使在最新版本的 Payara JSF 2.3 上,默认情况下也未启用,正如下面的评论之一所述。
在此处添加它以获得更好的搜索可见性。 :)
在 DirectoryBean 中添加此行:
// Activates CDI build-in beans
@FacesConfig(
version = JSF_2_3
)
并在 beans.xml 中将 bean-discovery-mode 更改为 "all"。 faces-config.xml 设置版本 2.3
我想要 post 一个完整的解决方案,应该怎样做才能使 JSF 2.3 库在 JSF v2.3 模式下工作。以下代码示例基于 GlassFish 5.0 服务器环境。
1) 至少将 JSF 库升级到 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 class,它实际上激活了 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)
每个项目添加一次,无需多次添加。
基本上其他人多次提到需要添加此注释,但在我的情况下它不起作用,直到我通过添加注释 @ApplicationScoped
将此 class 声明为 CDI bean。只有在我将 class 声明为 CDI bean、清除项目/重新启动服务器后 - JSF 2.3 模式终于被激活,现在我能够注入 JSF classes / 利用其他 JSF 2.3 功能!
解决方案 2:
切换到 Payara 5.183,开箱即用。不需要方案一:Jsf23Activator
我遇到了这个问题,因为在更新 JSF 之后,我的类路径中仍然有这个 jar:
el-impl-2.1.2.jar
删除这个后问题就消失了。