1

まず、ここで達成しようとしていることを説明します。定期的にデータを読み取り、JBoss AS 7.1.1でステートレスEJBを呼び出して、さらなる操作(データの計算とDBへの保存)を行うJavaアプリケーションがあります。次に、JSF2.0を使用するフロントエンドがあります。@ApplicationScoped CDI Beanであり、JSFプロジェクトに存在するコントローラーで、EJBを注入します。ここで、DBからデータを取得するためのEJBが必要です。この理由から、@ApplicationScopedCDIBeanを使用しています。

アプリケーションコンテキストは、すべてのサーブレットリクエスト、Webサービス呼び出し、EJBリモートメソッド呼び出し、EJB非同期メソッド呼び出し、EJBタイムアウト、および同じアプリケーション内で実行されるメッセージ駆動型Beanへのメッセージ配信の間で共有されます。アプリケーションがシャットダウンされると、アプリケーションコンテキストは破棄されます。

データはユーザーに依存しないため、すべてのクライアントに1つのCDIBeanのみが必要です。

ここで、@ ApplicationScoped CDI Beanのデータを更新します。これは、新しいデータが到着したときに実行されるメソッドであるEJBBeanを使用してJSFプロジェクトで定義されています。私はすでに@ApplicationScopedCDIBeanで@Injectを正常に使用しており、EJBプロジェクトからEJBを注入しました。今、私は逆のことをしたいと思います。ApplicationScopedCDIBeanをJSFプロジェクトからEJBBeanに注入しようとしました。しかし、これを書いたとき、警告として@Injectに下線が引かれました。

@Inject
private CurrentDataController currentDataController;

警告は次のとおりです。

インジェクションポイントへのインジェクションに適格なBeanはありません[JSR-299§5.2.1]

プロジェクトを公開しようとすると、CurrentDataControllerのクラスが見つからないという例外に関するエラーが発生します。

原因:java.lang.ClassNotFoundException:controllers.CurrentDataController from [Module "deployment.TestEAR.ear.TestEJB.jar:main" from Service Module Loader]

EJBプロジェクトはJSFプロジェクトのクラスを参照できないようです。また、TestJSF.jarではなくTestEJB.jarでCurentDataControllerクラスを探しています。私がここで欠けているものは何ですか?

私のプロジェクト全体の構造は次のとおりです。

  • TestEAR
    • TestEJB
    • TestEJBClient
    • TestJPA
    • TestJSF

クラス定義が見つからないというエラーを修正した後、投稿した警告に関連する別の問題が発生すると思います。

4

1 に答える 1

3

EARでは、EJBモジュール(jar)はWebモジュール(war)を可視化しません。EJBモジュールはUIに依存しないため、このレイヤーをデカップリングするのが普通です。問題を解決するには、2つのオプションがあります。

  1. EJBに注入する必要のあるBeanを1つのEJBモジュールに移動します(戦争でもそのBeanを注入できるようになります)
  2. アプリをリファクタリングして、戦争のみを行うようにします(はい、EJBを戦争に含めることができます)。アーキテクチャはより単純になり、完全なEJBはJBossで動作します(リモートEJBも)
于 2012-10-21T08:55:58.410 に答える