問題

次のコードスニペットがあります。

ビーン:

 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を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のさまざまなバージョンを含む数時間中に見つけることができたすべてのソリューションをチェックしました:

  1. 最初はbeans.xmlがプロジェクトに存在しませんでした - 問題 持続性;
  2. 空のbeans.xmlを追加しました - 問題は持続します。
  3. bean-discoverymode - "all"の2つの異なるオプションを持つ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 は同じエラーを出します。

  ベストアンサー

JSF 2.3 libsを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)このすべてのセットアップのkey-playerは、実際にJSF 2.3モードをアクティブにする特別に形成されたJavaクラスです。私の場合、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 2.3クラスを注入/他のJSF機能を利用できます。

  同じタグがついた質問を見る

jsfcdifaces-configpropertynotfoundexceptionjsf-2.3