javax.el.PropertyNotFoundExceptionの特定と解決:ターゲットに到達できません


127

そのようなELの管理対象Beanを参照しようとすると#{bean.entity.property}、時にはjavax.el.PropertyNotFoundException: Target Unreachable例外は、Beanのプロパティを設定する、またはBeanアクションが呼び出されるときに通常時に、スローされています。

5種類のメッセージがあるようです。

  1. ターゲット到達不能、識別子「bean」がnullに解決されました
  2. ターゲット到達不能、「エンティティ」がnullを返しました
  3. ターゲット到達不能、「null」がnullを返しました
  4. ターゲット到達不能、 '' 0 ''がnullを返しました
  5. ターゲット到達不能、「BracketSuffix」がnullを返しました

それらはすべてどういう意味ですか?それらはどのように引き起こされ、どのように解決されるべきですか?


weblogicを使用している場合は、このリンクを試してください。/programming/45422943/why-is-target-unreachable-identifier-resolved-to-null-on-weblogic/45490295#45490295
DenisMP 2017

SpringとWeblogicを使用している場合は、このリンクを参照してください。/programming/45422943/why-is-target-unreachable-identifier-resolved-to-null-on-weblogic?noredirect=1#comment77843630_45422943
DenisMP

突然、これが壊れました... サーバーを停止し、javax.faces.jar(Mojarra)を削除し、ビルドディレクトリを削除して、WebLogicサーバーの\ tmp \を削除することで、これを修正しました(私のBeanを認識しません)。ドメインの\ cache \フォルダー、サーバーを再起動、公開しようとすると、javaxが見つからないために失敗し、SVNがjavax.faces.jarの削除を元に戻します(そのため、単に移動してからそれを元に戻します)。突然、それは再びうまく
Andrew

上記の数行で、展開時に発生した関連ログメッセージを常に確認してください。これが実際の根本的な原因でした。Class [ Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote; ] not found. Error while loading [ cl ass org.mxchange.jfinancials.beans.financial.model.receipt.FinancialAdminReceiptWebRequestBean ]]]そして、Bean(FinancialAdminReceiptWebRequestBean)が見つかりませんでしたnull。解決できませんでした。もう1つのよくある間違いは、クラス/インターフェースの名前変更や移動(または忘れたclean)後にアプリケーションサーバーを再起動しないことです。
ローランド

回答:


238

1.ターゲット到達不能、識別子「bean」がnullに解決されました

つまり、マネージドBeanのインスタンス自体は、EL内のその識別子(マネージドBean名)からは正確に見つかりませんでした#{bean}

原因の特定は、3つのステップに分類できます。

a。誰が豆を管理していますか?
b。(デフォルトの)管理Bean名は何ですか?
c。バッキングBeanクラスはどこにありますか?

1a。誰が豆を管理していますか?

最初のステップは、Beanインスタンスの管理を担当するBean管理フレームワークを確認することです。それはJSFを経由して@ManagedBean?それともCDI経由@Namedですか?それともSpring via @Componentですか?同じバッキングBeanクラスに複数のBean管理フレームワーク固有のアノテーションが混在していないことを確認できますか?たとえば@Named @Component、または@Named @ManagedBean、または@ManagedBean @Component。これは間違っています。Beanは最大で1つのBean管理フレームワークで管理する必要があり、そのフレームワークは適切に構成する必要があります。どちらを選択すればよいかわからない場合は、バッキングBean(@ManagedBean)またはCDI Bean(@Named)に進んでください。Spring JSFの統合:JSFマネージドBeanにSpringコンポーネント/サービスを注入する方法

場合には、それはだJSFを経由してBeanを管理しています@ManagedBean、あなたは以下の点を確認してくださいする必要があります。

  • faces-config.xmlルート宣言はJSF 2.0と互換性があります。したがって、XSDファイルとでversion、少なくとも JSF 2.0 以上を指定する必要があり、したがって1.xを指定する必要はありません。

    <faces-config
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
        version="2.0">

    JSF 2.1の場合は、単に置き換える2_02.0による2_12.1、それぞれ。

    JSF 2.2以降を使用している場合は、すべての場所ではxmlns.jcp.orgなく名前空間を使用していることを確認してくださいjava.sun.com

    <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_2.xsd"
        version="2.2">

    JSF 2.3の場合は、単に置き換える2_22.2による2_32.3、それぞれ。

  • javax.annotation.ManagedBean代わりに誤ってインポートしていませんjavax.faces.bean.ManagedBean。IDEのオートコンプリートに注意してください。Eclipseは、リストの最初の項目として間違ったものを自動提案することが知られています。

  • 異なるマネージドBean名とともに、非常に同じバッキングBeanクラスで@ManagedBeanJSF 1.xスタイルの<managed-bean>エントリをオーバーライドしませんでしたfaces-config.xml。これはに優先し@ManagedBeanます。faces-config.xmlJSF 2.0以降、マネージドBeanを登録する必要はありません。削除するだけです。
  • ランタイムクラスパスはクリーンで、JSF API関連のJARに重複がありません。複数のJSF実装(MojarraとMyFaces)が混在していないことを確認してください。ターゲットコンテナがすでにJSF APIをバンドルしている場合は、webappに沿って別のJSFまたはJava EE API JARファイルを提供しないようにしてください。JSF wikiページの「JSFのインストール」セクションも参照してください。JSFのインストール手順について。コンテナー自体ではなくWARからコンテナーバンドルJSFをアップグレードする場合は、WARバンドルJSF API / implを使用するようにターゲットコンテナーに指示したことを確認してください。
  • JSF管理BeanをJARにパッケージ化する場合は、JARに少なくともJSF 2.0互換性があることを確認して/META-INF/faces-config.xmlください。JARファイルで提供されるJSF管理対象Beanを参照する方法も参照してください
  • あなたがしている場合、実際にジュラシックJSF 1.xのを使用して、アップグレードすることはできません、あなたは経由でBeanを登録する必要が<managed-bean>faces-config.xmlはなく、@ManagedBean。JSF 2.xライブラリがもうないようにプロジェクトのビルドパスを修正することを忘れないでください(@ManagedBeanアノテーションが混乱して正常にコンパイルされないようにするため)。


を介してBeanを管理しているのがCDIの場合@Namedは、次のことを確認する必要があります。

  • CDI 1.0(Java EE 6)では、/WEB-INF/beans.xmlWARでCDIを有効にするためにファイルが必要です。空にすることも、次のコンテンツのみを含めることもできます。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://java.sun.com/xml/ns/javaee" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                               http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    </beans>
  • CDI 1.1(Java EE 7)でbeans.xmlbeans.xmlファイルがない、または空のファイルがある場合、または上記のCDI 1.0と互換性beans.xmlがある場合は、CDI 1.0と同じように動作します。CDI 1.1の互換性があります場合はbeans.xml、明示的でversion="1.1"、それはデフォルトでのみ登録する@Named豆をしてこのような明示的なCDIスコープ注釈@RequestScoped@ViewScoped@SessionScoped@ApplicationScoped、などの場合は、あなたも、これらの明示的に使われていない、CDI管理対象BeanをとしてすべてのBeanを登録しようとしますCDIスコープは、CDI互換1.1の下に使用/WEB-INF/beans.xmlしてbean-discovery-mode="all"(デフォルトはセットbean-discovery-mode="annotated")。

    <?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"
           version="1.1" bean-discovery-mode="all">
    </beans>
  • bean-discovery-mode="annotated"(デフォルト)でCDI 1.1+を使用する場合javax.faces.bean.RequestScopedは、CDIスコープではなくJSFスコープなどを誤ってインポートしていないことを確認してくださいjavax.enterprise.context.RequestScoped。IDEのオートコンプリートに注意してください。

  • Mojarra 2.3.0-2.3.2およびCDI 1.1+ bean-discovery-mode="annotated"(デフォルト)を使用する場合、バグのため、Mojarraを2.3.3以降にアップグレードする必要があります。アップグレードできない場合bean-discovery-mode="all"beans.xml、で設定するか、またはJSF 2.3固有の@FacesConfigアノテーションをWARの任意のクラス(通常、ある種のアプリケーションスコープの起動クラス)に配置する必要があります。
  • TomcatやJettyなどの非Java EEコンテナーには、CDIがバンドルされて出荷されません。手動でインストールする必要があります。ライブラリJARを追加するだけではなく、少し手間がかかります。Tomcatの場合は、この回答の手順に従ってください:TomcatにCDIをインストールして使用するには?
  • ランタイムクラスパスはクリーンで、CDI API関連のJARに重複がありません。複数のCDI実装(Weld、OpenWebBeansなど)が混在していないことを確認してください。ターゲットコンテナーが既にCDI APIをバンドルしている場合は、webappに沿って別のCDIまたはJava EE API JARファイルを提供しないようにしてください。
  • JSFビューのCDI管理BeanをJARにパッケージ化する場合は、JARに少なくとも有効な/META-INF/beans.xml(空のままにしておくことができる)ことを確認してください。


を介してBeanを管理しているのがSpringの場合@Componentは、次のことを確認する必要があります。

  • Springはドキュメントに従ってインストールおよび統合されています。重要なのは、少なくともこれをweb.xml次の場所に置く必要があることです。

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    そしてこれはfaces-config.xml

    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
  • (上記は、Springに関して私が知っているすべてです—私はSpringを実行しません—他の考えられるSpring関連の原因を編集/コメントしてください;たとえば、XML構成関連のトラブルなど)


場合には、それはだRepeaterコンポーネントの経由(ネストされた)豆を管理していますvar(例:属性<h:dataTable var="item"><ui:repeat var="item"><p:tabView var="item">、など)や、あなたが実際に得た「目標到達不能は、識別子『アイテム』 nullに解決」、あなたは以下のことを確認する必要があります:

  • #{item}で参照されていないbinding任意の子コンポーネントのattribtue。binding属性はビューのレンダリング時ではなくビューのビルド時に実行されるため、これは正しくありません。さらに、コンポーネントツリーには物理的に1つのコンポーネントしかなく、各反復ラウンド中に単純に再利用されます。つまり、のbinding="#{bean.component}"代わりに実際に使用する必要がありますbinding="#{item.component}"。しかし、Beanへのコンポーネントの結合を完全に取り除き、この方法で解決しようと考えていた問題に対する適切なアプローチを調査/質問する方がはるかに優れています。JSFで「バインディング」属性がどのように機能するかを参照してください。いつ、どのように使用すべきですか?


1b。(デフォルトの)管理対象Beanの名前は何ですか?

次に、登録されている管理対象Bean名を確認します。JSFとSpringの使用規則はJavaBeans仕様に準拠していますが、CDIにはCDI実装/バージョンに応じて例外があります。

  • FooBean以下のようなバッキングBeanクラス、

    @Named
    public class FooBean {}

    すべてのBean管理フレームワークでは、#{fooBean}JavaBeans仕様に従って、デフォルトの管理対象Bean名がになります。

  • FOOBean以下のようなバッキングBeanクラス、

    @Named
    public class FOOBean {}

    非修飾クラス名が2つ以上の大文字で始まるJSFおよびSpringでは、デフォルトの管理対象Bean名は完全修飾されていないクラス名#{FOOBean}であり、JavaBeans仕様にも準拠します。CDIでは、これが原因に2015年6月以前にリリースされた溶接のバージョンではなく、2015年6月以降に発売溶接のバージョン(2.2.14 / 2.3.0.B1 / 3.0.0.A9)にもOpenWebBeansでも同様ですにおける監督CDI仕様。これらのWeldバージョンおよびすべてのOWBバージョンでは、最初の文字のみが小文字になり#{fOOBean}ます。

  • foo以下のようなマネージドBean名を明示的に指定した場合、

    @Named("foo")
    public class FooBean {}

    または同等にと@ManagedBean(name="foo")@Component("foo")、それが唯一で利用できるようになります#{foo}ので、ないことで#{fooBean}


1c。バッキングBeanクラスはどこにありますか?

3番目のステップは、バッキングBeanクラスがビルドおよびデプロイされたWARファイルの適切な場所にあるかどうかをダブルチェックすることです。実際にコードを書き、ブラウザでF5キーを押すのが忙しい場合に備えて、プロジェクトとサーバーの完全なクリーン、再構築、再デプロイ、再起動を適切に実行したことを確認してください。それでも無駄な場合は、ビルドシステムにWARファイルを生成させます。WARファイルは、ZIPツールで抽出して検査します。.classバッキングBeanクラスのコンパイル済みファイルは、のパッケージ構造に存在する必要があります/WEB-INF/classes。または、JARモジュールの一部としてパッケージ化されている場合、コンパイルされた.classファイルを含むJARは、/WEB-INF/libたとえばEAR /libや他の場所に存在していてはならず、存在する必要があります。

Eclipseを使用している場合、バッキングBeanのクラスが含まれていることを確認しますsrcので、やない WebContent、とことを確認するプロジェクト>ビルドが自動的に有効になります。あなたはMavenを使用している場合は、バッキングBeanのクラスが含まれていることを確認しますsrc/main/javaので、およびないsrc/main/resourcessrc/main/webapp

EJB + WARを持つEARの一部としてWebアプリケーションをパッケージ化する場合、バッキングBeanクラスがWARモジュールにあり、したがってEARモジュールにもEJBモジュールにもないことを確認する必要があります。ビジネス層(EJB)には、Web層(WAR)関連のアーティファクトがないようにする必要があります。これにより、ビジネス層は、複数の異なるWeb層(JSF、JAX-RS、JSP /サーブレットなど)で再利用できます。


2.ターゲット到達不能、「エンティティ」がnullを返しました

これは、ネストされたプロパティentity#{bean.entity.property}返された場合と同じnullです。これは通常、JSFが以下のような入力コンポーネントを介して値を設定する必要がある場合にのみ公開されますがproperty#{bean.entity}実際にはが返されnullます。

<h:inputText value="#{bean.entity.property}" />

同じビューでCRUDリストやダイアログを操作する場合は@PostConstruct、事前に、または<f:viewAction>メソッド、またはおそらくadd()アクションメソッドでモデルエンティティを準備しておく必要があります。

@Named
@ViewScoped
public class Bean {

    private Entity entity; // +getter (setter is not necessary).

    @Inject
    private EntityService entityService;

    @PostConstruct
    public void init() {
        // In case you're updating an existing entity.
        entity = entityService.getById(entityId);

        // Or in case you want to create a new entity.
        entity = new Entity();
    }

    // ...
}

の重要性について@PostConstruct; CDIなどのプロキシを使用するBean管理フレームワークを使用している場合、通常のコンストラクタでこれを行うと失敗します。常に@PostConstructマネージドBeanインスタンスの初期化@PreDestroyをフックするために使用します(マネージドBeanインスタンスの破棄をフックするために使用します)。さらに、コンストラクターでは、注入された依存関係にまだアクセスできません。コンストラクターで@Inject BeanにアクセスしようとしているときにNullPointerExceptionも参照してください。

entityIdがを介して提供される場合は、の代わり<f:viewParam>に使用する必要があります。f:viewAction / preRenderViewとPostConstructをいつ使用するかを参照してください<f:viewAction>@PostConstruct

またnulladd()アクションメソッドでのみ作成する場合に備えて、ポストバック中に非モデルを保持することを確認する必要もあります。Beanをビュースコープに配置するのが最も簡単です。正しいBeanスコープの選択方法も参照してください


3.ターゲット到達不能、「null」がnullを返しました

これは実際には#2と同じ原因があり、使用されている(古い)EL実装のみが例外メッセージに表示するプロパティ名を保持するのに多少バグがあり、最終的に誤って「null」として公開されます。これにより、ネストされたプロパティがかなりある場合にのみ、デバッグと修正が少し難しくなります#{bean.entity.subentity.subsubentity.property}

解決策は同じです。問題のネストされたエンティティがnull、すべてのレベルででないことを確認してください。


4.ターゲット到達不能、 '' 0 ''がnullを返しました

これも#2と同じ原因があり、使用されている(古い)EL実装のみが例外メッセージの作成にバグがあります。これは[]、ELでブレース表記を使用し#{bean.collection[index]}#{bean.collection}それ自体がnull以外である場合にのみ公開されますが、指定されたインデックスのアイテムは存在しません。このようなメッセージは、次のように解釈する必要があります。

ターゲット到達不能、 'collection [0]'がnullを返しました

解決策も#2と同じです。コレクションアイテムが利用可能であることを確認してください。


5.ターゲット到達不能、「BracketSuffix」がnullを返しました

これは実際には#4と同じ原因があり、使用されている(古い)EL実装のみが例外メッセージに表示する反復インデックスを保持するのに多少バグがあり、最終的には実際に文字である「BracketSuffix」として誤って公開され]ます これにより、コレクションに複数のアイテムがある場合にのみ、デバッグと修正が少し難しくなります。


その他の考えられる原因javax.el.PropertyNotFoundException


私は3番に実行して#{bean.entity.property}<p:selectBooleanCheckbox value="#{bean.entity.property}"/>ます。値を出力しますが失敗します。私のブール値にはセッターがあります。同じエンティティの整数プロパティはありません入力フィールドで使用した場合の仕事を。何か案は?
Jasper de Vries、2016年

確認する価値のあるもう1つの点は、JSFとCDIの実装が統合されていることを確認することです。これが私の問題でした。stackoverflow.com
Jerry B. no.1 intern

説明::Target Unreachable, identifier 'bean' resolved to nullマルチモジュールmavenプロジェクト(ejb、web、earのモジュールを含む)では、webモジュールがejbモジュールへの依存関係を宣言していることを確認してください。これがないと、@ManagedBeanJSF2.0を使用してを解決することができず、それらをで宣言する必要がありますfaces-config.xml。Webモジュールにejbを含める依存関係を宣言しなかったことに気づき、約2時間かかりました(耳にejbとwebのみが含まれていた)
17

1
@bish @ManagedBeanクラスのようなフロントエンドのアーティファクトは、最初はサービスレイヤー(EJBプロジェクト)に属していません。stackoverflow.com/questions/13011392/jsf-service-layer
BalusC

Beanがシリアライズ可能でない場合も、このエラーが発生する可能性があります(stackoverflow.com/questions/47533584/にあると思われます(ただし、現在自分で試すことはできません))
Kukeltje '28

6

まだ行き詰まっている人のために...

CDIでNetBeans 8.1とGlassFish 4.1を使用すると、何らかの理由で、この問題はリモートサーバーではなくローカルでのみ発生しました。トリックは何ですか:

-> javaee-web-api 6.0である、NetBeansによって提供されるデフォルトのpomバージョンの代わりにjavaee-web-api 7.0を使用します。

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
    <type>jar</type>
</dependency>

->このjavaee-web-api-7.0.jarをlibとしてサーバー(domain1フォルダーのlibフォルダー)にアップロードし、サーバーを再起動します。


これは、「ランタイムクラスパスがクリーンで、CDI API関連のJARに重複がないこと」に一致します。つまり、ランタイムクラスパスが重複したライブラリでなんらかの形で混乱していました。
BalusC 2016

確かに、そしてあなたの答えは私が焦点を当てるべきであると思われる問題を特定するのに役立ちました;-)ここに私の特定のソリューションの詳細を提供するだけで、数人のユーザーの時間を節約できます。
セーヌクル2016

1

私は自分で解決した後、このエラーに関する私の発見を共有することにしました。

まず第一に、BalusCソリューションは真剣に受け止められるべきですが、Netbeansには、特にMavenを使用してエンタープライズアプリケーションプロジェクト(EAR)を構築するときに注意する必要がある別の問題がある可能性があります。

Netbeansは、親POMファイルEARプロジェクトEJBプロジェクトWARプロジェクトを生成します。私のプロジェクトの他のすべては問題なく、GlassFish 4.1にはNetbeans 8.0に埋め込まれたGlassFish 4.1を作成するWeld CDIバグがあるため、問題はおそらくGlassFish 4.0のバグであると思いました(インストールしてNetbeansにプラグインする必要がありました)。 2パッチを使用しない限り使用できません。

解決:

「ターゲット到達不能、識別子「bean」がnullに解決されました」 エラーを解決するには

I親POMプロジェクトを右クリックし、[ プロパティ ]を選択します。プロジェクトのプロパティダイアログが表示されたら、[ソース]をクリックします。「ソース/バイナリ形式」が1.5に設定され、「エンコーディング」がWindows 1250に設定されていることに驚かれます。「ソース/バイナリ形式」を1.6 0r 1.7に変更します。プロジェクトをCDIに準拠させ、「エンコーディング」をUTF-8にしたい。

他のすべてのサブプロジェクト(EAR、EJB、WAR)に互換性がない場合は、同じようにします。プロジェクトを実行すると、そのエラーは再び発生しなくなります。

これが同様のエラーを抱えている誰かの助けになることを願っています。


私はあなたの答えを一般に(多くの種類の直接関連しない情報に対して)理解することは困難であり、ソース/バイナリ形式とエンコーディングがこの問題で役割を果たすこともわかります。これを変更しても、問題を解決する良い/完全な再構築がトリガーされただけではありませんか?
Kukeltje 2017

1

ここで提供された多くの回答は役に立ちましたが、まだこの問題がありました。私の場合、新しいプロジェクトにJSF 2.3、jdk10、jee8、cdi 2.0を使用していて、wildfly 12でアプリを実行しました。wildflyのWebサイトで推奨されているように、パラメーターstandalone.sh -Dee8.preview.mode = trueでサーバーを起動します。 。wildfly 13をダウンロードした後、「beanがnullに解決された」という問題はなくなりました。wildfly13にまったく同じwarをアップロードすると、すべて正常に動作しました。


1

私が持っているクラスでは@SpringBootApplication、コントローラのパッケージ名を指定するのを忘れていたため、このエラーが発生しました。

今回は、基本パッケージを構成するのではなく、Springがスキャンする必要のあるコンポーネントを指摘するために、より具体的にしたいと思いました。

それはこのようなものでした:

@ComponentScan(basePackages = {"br.com.company.project.repository", "br.com.company.project.service"})

ただし、正しい形式は次のいずれかです。

@ComponentScan(basePackages = {"br.com.company.project.repository", "br.com.company.project.service", "br.com.company.project.controller"})

@ComponentScan(basePackages = {"br.com.company.project")

私は自分の解決策を共有することにしました。正しい答えは非常に包括的ですが、この(偶発的な)間違いはカバーされていないためです:)


0

私の場合、@ Named( "beanName")でスペルミスを犯しました。 "beanName"であると想定されていましたが、たとえば "beanNam"と書きました。


0

私はjavaeeコンテナにwildfly 10を使用しています。「ターゲット到達不能、「エンティティ」がnullを返しました」という問題が発生しました。BalusCからの提案に感謝しますが、解決策のうち私の問題が説明されました。誤って「import com.sun.istack.logging.Logger;」を使用しています。「import org.jboss.logging.Logger;」の代わりに CDIによりJSF ELが実装されました。ソリューションの改善に役立つことを願っています。


0

同じ問題がありました。解決策ははるかに簡単であることがわかりました。データテーブルは、someMethod()だけでなく、getter、つまりgetSomeMethod()の形式のメソッドを必要とするようです。私の場合、データテーブルではfindResultsを呼び出していました。バッキングBeanのメソッドをgetFindResults()に変更すると、機能しました。

commandButtonは、getなしでfindが機能し、混乱を招くだけでした。


0

#2に関しては、私の場合、交換後に魔法のように生き返った

<body>

タグ付け

<h:body>

いくつかの(より簡単に、正直に言うと)JSFプロジェクトを実行した後、今は別の設定を行うことを思い出せず、初めてこの種のエラーが発生しました。私は非常に基本的なログインページ(ユーザー名、パスワード、ユーザーBean ...)を作成し、通常どおりすべてを設定していました。私が見つけた唯一の違いは前述のタグです。多分誰かがこれが便利だと思います。


0

私の場合の問題は、パラメーターを受け取るコンストラクターを含めたが、Injectアノテーションを付けた空のコンストラクターを含めなかったことでした。

@Inject public VisitorBean() {}

コンストラクタなしでテストしたところ、これも機能しているようです。


0

1.トピック(Target Unreachable、識別子 'bean'がnullに解決)。

@BalusCと他の共有者の貴重な回答をチェックしましたが、私のシナリオでは、この問題をこのように超えています。別の名前で新しいxhtmlを作成し、別の名前でBeanクラスを作成した後、新しいBeanクラスと新しいxhtmlファイルにコードを(コピーアンドペーストではなく)段階的に記述しました。


0

AnnotationConfigWebApplicationContextコンテキストパラメータをweb.xmlファイルから削除すると

以下に示すようにparamのようになっている場合は、web.xmlファイルから削除する必要があります

<context-param>
    <param-name>contextClass</param-name>
    <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext
  </param-value>
</context-param> 

これがなぜそれを解決するのかを詳しく説明しますか?それともなぜそれが問題を引き起こすのですか?
Kukeltje

-1

古いスタイルでのJSFの操作beans-config.xmlファイル(WEB-INFフォルダーにあります)でマネージドBeanを定義 し、web.xmlファイルでそれを参照する必要があります。

beans-config.xml

<managed-bean>
  <managed-bean-name>"the name by wich your backing bean will be referenced"</managed-bean-name>
  <managed-bean-class>"your backing bean fully qualified class name"</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>    
</managed-bean>

(私は他のスコープを使ってみましたが...)

web.xml

<context-param>
  <param-name>javax.faces.CONFIG_FILES</param-name>
  <param-value>"/WEB-INF/beans-config.xml</param-value>
</context-param>

-2

別の手がかり:私はJSFを使用していて、mvn依存関係を追加しました:com.sun.faces jsf-api 2.2.11

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.11</version>
    </dependency>

次に、Primefacesに変更して、primefaces依存関係を追加しようとしました。

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>6.0</version>
</dependency>

xhtmlをh:からp:に変更し、xmlns:p = "http://primefaces.org/uiをテンプレートに追加しました。JSFでのみ、プロジェクトは問題なく実行され、managedbeanは問題なく到達しました。Primefacesを追加すると到達できないオブジェクト(javax.el.propertynotfoundexception)を取得していました。問題は、JSFがPrimefacesではなくManagedBeanを生成していて、オブジェクトのPrimefacesを要求していたことです。.pomからjsf-implを削除し、クリーンでプロジェクトをインストールします。この時点からすべて問題なく動作しました。


2
問題の原因を推測しても意味がありません。PrimeFacesはJSF実装ではありません。これは、「ランタイムクラスパスがクリーンで、CDI API関連のJARに重複がない」という要件に一致します言い換えると、ランタイムクラスパスは重複したライブラリでなんらかの方法でめちゃくちゃにされ、PrimeFacesはそれを拡大するだけで、それを引き起こしていませんでした。
BalusC 2016年

-3

ELは$ {bean.propretyName}を説明どおりに解釈します-getter / setterを生成する明示的または暗黙的なメソッドを使用しているという前提で、propertyNameはgetPropertyName()になります

名前を関数として明示的に識別することにより、この動作をオーバーライドできます。$ {bean.methodName()}これは、変更せずに関数メソッドName()を直接呼び出します。

アクセサーの名前が「get ...」であるとは限りません。


1
これは正しい方法ではないため、入力コンポーネントの背後で適切なセッターを呼び出すことができません。これも上記の例外の原因にはなりません。これは、のaction="#{bean.property}"代わりになどのアクションメソッド式でプロパティを参照するのに間違えたという上記の例外を引き起こすだけですaction="#{bean.method}"
BalusC 2018

驚くべきことに、関数型プログラミングを備えた現代のJavaの世界では、この「正しい習慣」が変化しています。dev.to/scottshipp/… とその参照を参照してください。Lombokにはget / setが追加されていない「fluent」の設定があることに注意してください。私たちの会社には1000人のエンジニアがいます。
sdw 2018

1
あなたとあなたの1000人のエンジニアは、プロパティとメソッドを混同していると思います。
BalusC 2018

この設計手法は、並行性が非常に高い大規模アプリケーションで一般的になりつつあります。あなたの反対票は、広大なコミュニティが潜在的なバグを追跡するのに役立つ回答の価値ではなく、設計ガイドラインの1つのビューに基づいていることを申し上げます。
sdw

1
え?申し訳ありませんが、何を話しているのか分からないという印象は無視できません。
BalusC

-3

私の場合、「el-ri-1.0.jar」がありませんでした。


1
通常はまったく必要ないので、他にも問題があります。おそらくダーティなランタイムクラスパス。サーバーによってすでに提供されているはずのライブラリを追加することで、長期的に悪化させるのではなく、修正する必要があります。
BalusC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.