11

次の構造の WAR ファイルがあります。

ここに画像の説明を入力

JSF マネージド BeanBusinessObjectTypeListControllerは にあり、commons-web-1.0.jar/WEB-INF/lib参照されていBusinessObjectTypeListView.xhtmlます。Web アプリケーションを実行してそのビューを呼び出すと、次のエラーが発生します。

javax.servlet.ServletException: /view/common/businessObjectTypeListView.xhtml @34,94 listener="#{businessObjectTypeListController.selectData}": ターゲット到達不能、識別子 'businessObjectTypeListController' が null に解決されました

コントローラ クラスが見つからないのはなぜですか? クラスパスにあるはずですよね?

4

3 に答える 3

29

JSF が JAR ファイルをスキャンして、JSF アノテーションなどのクラスを検索し、それらを自動登録するには、ファイルにJSF 2.0 準拠のファイルが必要/META-INF/faces-config.xmlです。commons-web-1.0.jar@ManagedBean

<?xml version="1.0" encoding="UTF-8"?>
<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">
</faces-config>

つまり、JSF は、クラスパス内のすべての JAR ファイルのすべてのクラスをスキャンするわけではなく、コストが高すぎます。上記のファイルを含む JAR のみ/META-INF/faces-config.xmlがスキャンされます。

また、webapp 自身のファイルの宣言に属性が含まれていないことを確認する必要があります。そうしないと、JSF はこの Faces 構成が完了したと見なし、JAR ファイルをアノテーション用に自動スキャンしません。metadata-complete="true"<faces-config>/WEB-INF/faces-config.xml

これらの条件のいずれも満たされない (または満たされる可能性がある) 場合は、注釈に頼るのではなく<managed-bean>、webapp 自体のように手動で Bean を登録する必要があります。/WEB-INF/faces-config.xml

JSF 2.0仕様の11.4.2章も参照してください(強調鉱山)。

11.4.2 アプリケーションの起動動作

...

このアルゴリズムは、JSF ベースの Web アプリケーションのコンポーネントを組み立てる開発者にかなりの柔軟性を提供します。たとえば、アプリケーションには、関連付けられたレンダラーとともに 1 つ以上のカスタム UIComponent 実装が含まれている場合があるため、「/WEB-INF/faces-config.xml」という名前のアプリケーション リソースでそれらを宣言できます。アプリケーションにプログラムで登録する必要はありません。実例。さらに、アプリケーションは、「META-INF/faces-config.xml」リソースを含むコンポーネント ライブラリ (JAR ファイルとしてパッケージ化) を含めることを選択する場合があります。 このリソースが存在すると、このライブラリー JAR ファイルに格納されているコンポーネント、レンダラー、およびその他の JSF 実装クラスが自動的に登録されます。アプリケーションでアクションを実行する必要はありません。

于 2011-10-05T15:37:43.510 に答える
1

私の場合、CDI Bean にも同じ問題があります。

CDI Bean を配置した common.jar プロジェクトがあります。(beans.xml なしで) lib と beans.xml に common.jar を含む webapp.war があります。

jsf から cdi Bean を呼び出すと、到達できないという例外が発生します:/

プロジェクト構造は maven を使用して作成されます: - common.jar の maven-archetype-quickstart - webapp.war の maven-archetype-webapp

Glassfish 3.1.x への展開で eclipse/juno を使用しています。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

解決済み: EJB および JAR パッケージの場合、beans.xml を src/main/resources/META-INF/ に配置する必要があります。WAR パッケージの場合、beans.xml を src/main/webapp/WEB-INF/ に配置する必要があります。src/main/java および src/test/java ディレクトリには .java ファイルのみを配置する必要があることに注意してください。.xml ファイルなどのリソースは、src/main/resources にある必要があります。

トピックから: CDI: beans.xml、どこに入れますか?

于 2013-02-15T09:24:21.820 に答える
0

私の意見では、クラス BusinessObjectTypeListController は適切に作成されていますが、インスタンス化されていません。

ビューでクラスのインスタンスを作成する方法は? BeanFactory を使用する場合は、構成 xml ファイルを確認してください

于 2011-10-05T15:57:43.577 に答える