【问题标题】:Changing faces-config.xml from 2.2 to 2.3 causes javax.el.PropertyNotFoundException: Target Unreachable, identifier 'bean' resolved to null将 faces-config.xml 从 2.2 更改为 2.3 会导致 javax.el.PropertyNotFoundException: Target Unreachable, identifier 'bean' resolve to null
【发布时间】:2023-04-03 09:50:01
【问题描述】:

有如下代码sn-ps:

豆子:

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

  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 这样的示例项目会给出相同的错误。

【问题讨论】:

  • 你刚刚改变了 faces-config 吗?这意味着您已经在 J​​SF 2.3.2 版本上,只是更改了 faces-config?
  • 是的,完全正确!将 faces-config 恢复为 JSF 2.2 语法 - 解决了这个问题。
  • 一个小的快速谷歌搜索结果如下:stackoverflow.com/questions/44064995/…。您是否也在使用“外部”JSF 库?一个在您的网络应用中提供?
  • 谢谢你,是的,我也检查了那个帖子和许多其他的......但到目前为止没有任何解决方案有帮助。关于您的问题:在 Payara 4.1.2 和 GlassFish 4.1.2 上 - 是的,我已经手动将原始 JSF 2.2.X javax.faces.jar 替换为 JSF 2.3.2 jar。但是 GlassFish 5 已经随 JSF 2.3.2 一起发布了——但是我遇到了同样的错误......顺便说一句:在 Mojarra 问题跟踪器中发现了类似的问题:github.com/javaserverfaces/mojarra/issues/4264
  • 接下来请输入您尝试过的内容、阅读过的内容等...节省我们的时间。另见How to Ask!!!

标签: jsf cdi faces-config propertynotfoundexception jsf-2.3


【解决方案1】:

我想发布一个完整的解决方案,为了使 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 模式终于被激活,现在我能够注入 JSF 类/利用其他 JSF 2.3 功能!

【讨论】:

  • 谢谢,在激活器 bean 上添加 @ApplicationScoped 对我来说是至关重要的一步。我的设置中的 FWIW (Payara 5.181) 我没有 beans.xml 或 faces-config.xml,所以我认为它们不是绝对必要的。
  • 虽然您的答案很吸引人,但使用 JSF 2.3 功能的配置混乱是荒谬的。感谢分享。
  • @MartinCharlesworth 也许bean defining annotation 是必要的,所以实际上发现了这个类。
  • 在这种情况下我们真的需要beans.xml 吗?由于@ApplicationScoped 是一个定义注解的bean,这个归档创建了一个隐式归档。
【解决方案2】:

我遇到了这个问题,因为在更新 JSF 之后,我的类路径中仍然有这个 jar:

el-impl-2.1.2.jar

删除这个后问题就消失了。

【讨论】:

    【解决方案3】:

    在 DirectoryBean 中添加这一行:

    // Activates CDI build-in beans
     @FacesConfig(
             version = JSF_2_3
    )
    

    在 beans.xml 中将 bean-discovery-mode 更改为“all”。 faces-config.xml 设置版本 2.3

    【讨论】:

    【解决方案4】:

    解决方案 2:

    切换到 Payara 5.183,它开箱即用。无需解决方案一:Jsf23Activator

    【讨论】:

      猜你喜欢
      • 2015-06-22
      • 1970-01-01
      • 2015-09-25
      • 2018-09-21
      • 2016-07-21
      相关资源
      最近更新 更多