web-dev-qa-db-ja.com

faces-config.xmlを2.2から2.3に変更すると、javax.el.PropertyNotFoundException:ターゲット到達不能、識別子「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;
    ....
}

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(フル)サーバーにデプロイされ、「提供」スコープで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. bean-discovery-modeの2つの異なるオプション-"all"と "annotated"を含むbeans.xmlを追加-問題は持続。

\ 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 ver 1.8.0_144)のローカルインスタンス、およびPayara 4.1.2.172(Java ver 1.8.0_131)のリモートインスタンスでテストされています。

ありがとう!

注:このようなサンプルプロジェクト https://github.com/AnghelLeonard/JSF-2.3/tree/master/JSF23InjectInConverterValidator でも同じエラーが発生します。

9
Andrew-Gr

完全なソリューションを投稿したいと思います。JSF2.3ライブラリを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)はプロジェクトごとに1回追加されます。何度も追加する必要はありません。

基本的に、この注釈を追加する必要性は他の人から何度か言及されましたが、私の場合、注釈_@ApplicationScoped_を追加してこのクラスをCDI Beanとして宣言するまで機能しませんでした。クラスをCDI Beanとして宣言し、プロジェクトをクリアしてサーバーを再起動した後にのみ、JSF 2.3モードがようやくアクティブになり、JSFクラスを注入したり、他のJSF 2.3機能を利用したりできるようになりました。

10
Andrew-Gr

JSFの更新後も、クラスパスにこのjarが残っていたため、この問題が発生しました。

el-impl-2.1.2.jar

これを削除した後、問題はなくなりました。

1

解決策2:

payara 5.183に切り替えると、そのまま使用できます。ソリューション1は不要:Jsf23Activator

0
usertest

directoryBeanに次の行を追加します。

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

そして、beans.xmlでbean-discovery-modeを "all"に変更します。 faces-config.xmlセットバージョン2.3

0
Tadas B.