jsf - 将 faces-config.xml 从 2.2 更改为 2.3 会导致 javax.el.PropertyNotFoundException : Target Unreachable, 标识符 'bean' 解析为 null

标签 jsf cdi faces-config propertynotfoundexception jsf-2.3

有以下代码片段:

bean :

import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named(value = "directoryBean")
@ViewScoped
public class DirectoryBean implements Serializable {

private static final long serialVersionUID = 1L;
    ....
}

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

将 faces-config.xml 从版本 2.2 更改为版本 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(完整)服务器上,并且还添加到具有“provided”范围的 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:

  1. 最初项目中不存在 beans.xml - 问题 坚持;
  2. 添加了空 beans.xml - 问题仍然存在;
  3. 添加了 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 年 3 月 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 上,默认情况下也未启用,正如下面的评论之一所提到的。 将其添加到此处以获得更好的搜索可见性。 :)

最佳答案

我想发布一个完整的解决方案,应该做什么才能使 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 类,它实际上激活 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 将此类声明为 CDI bean 后才起作用。只有在我将类声明为 CDI bean、清除项目/重新启动服务器之后,JSF 2.3 模式才最终被激活,现在我能够注入(inject) JSF 类/利用其他 JSF 2.3 功能!

关于jsf - 将 faces-config.xml 从 2.2 更改为 2.3 会导致 javax.el.PropertyNotFoundException : Target Unreachable, 标识符 'bean' 解析为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45682309/

相关文章:

jsf - 如何在 JSF 页面加载之前在支持 bean 中启动特殊的 init 事件?

java - JSF/RichFaces : conditional text styling

jsf - Richfaces 与 Internet Explorer 11 的兼容性问题

jsf - 同时调用多个支持 bean 方法

navigation - 在 jsf-2.2 中的 faces-config 中传递重定向参数

java - JSF 2.0 问题(faces-config)

jsf - 是否可以使用 JSF 1.2 动态加载 Phase Listener?

java - JSF SelectOneRadio 按钮无法禁用

tomcat - Tomcat 7 上的 CDI - 它有意义吗?

java - 无法让@Singleton 做任何事情