1

Glassfish3.1.2を使用してnetbeansAPI上でアプリケーションを開発しています。私のnetbeansアプリケーションは、EJBに接続する必要があるスタンドアロンのJavaクライアントであると想定されています。

EJBをEAR(エンタープライズアプリケーション)にパッケージ化しました。私が直面している問題は、使用可能なEJBを検索しようとしたときに例外が発生したことです。

これが私のBeanセッションです。

@Stateless
@EJB(name = "java:global/AltServer", beanInterface = AltServerRemote.class)
public class AltServer implements AltServerRemote {

リモートインターフェース:

@Remote
public interface AltServerRemote {

そして最後にルックアップ呼び出し:

props.setProperty("org.omg.CORBA.ORBInitialHost", getGlassfishHostname());
props.setProperty("org.omg.CORBA.ORBInitialPort", getServerPort());
ctx = new InitialContext(props)

ctx.lookup("java:global/AltServerEnt/AltServer-ejb/AltServer")

EARにパッケージ化されたEJBをルックアップする方法について、私はこれに従いました:http: //glassfish.java.net/javaee5/ejb/EJB_FAQ.html#CosNamingそしてjndi構文を見つけます:

java:global[/<app-name>]/<module-name>/<bean-name>

したがって、私の場合、エンタープライズアプリケーションはAltServerEntであり、EJBモジュールはAltServer-ejbであり、セッションBeanはAltServerと呼ばれます(上記を参照)。

注:セッションBeanに@EJBアノテーションを使用して、上記のリンク先のFAQで説明されているような名前を指定しましたが、EJBがEARの一部である場合に適しているかどうかはわかりません。誰か知ってる?

そして、ここで私が得た例外は、ルックアップの行で発生しました:

java.lang.ClassNotFoundException: com.sun.ejb.codegen.GenericEJBHome_Generated

「Caused」句はたくさんありますが、最初の句は次のとおりです。

javax.naming.NamingException: Lookup failed for 'java:global/AltServerEnt/AltServer-ejb/AltServer' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost=127.0.0.1, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: ejb ref resolution error for remote business interfaceorg.altanis.remote.AltServerRemote [Root exception is java.lang.RuntimeException: Could not invoke defineClass!]]

だから私のセッションBeanが見つからないと思いますが、なぜですか?私のJNDI構文は正しくありませんか?

編集:私のプロジェクト組織に注意してください:

  • AltServerEnt:エンタープライズアプリケーション-EJBモジュールが含まれています
  • AltServer-ejb:EJBモジュール-セッションBeanが含まれ、リモートインターフェイス(AltServerRemote)を含むnetbeansプラグインが含まれます。

読んでくれてありがとう。

4

1 に答える 1

1

EAR/EJB がデプロイされたようです。Glassfish 管理コンソールを起動してhttps://<host>:4848ログインします。左側でアプリケーションをナビゲートしApplicationsてクリックし、[アプリケーションの編集] 画面を表示します。表示されているアプリケーションの名前とコンポーネント名を調べて、予想と比較してください。

現時点ではリモート EJB をデプロイしていないため、確認できませんが、リモート EJB の場合は、Action列の下に URL を表示するためのリンクがあると思います。

命名オプション

  1. AltServerこの名前を EJB の名前として使用します: name="EJB(name = "AltServer" ...)。「単純な名前」を使用すると、Bean はさまざまな JNDI 名前空間 (global/app/module) で見つけることができます。ルックアップが機能するctx.lookup("java:global/AltServerEnt/AltServer-ejb/AltServer")はずです。

  2. プレフィックスを追加するjava:globalと、JNDI グローバル名前空間で名前を直接宣言したことになります。同じ名前を使用して、その名前空間で Bean を直接検索できますjava:global/AltServer。はい、他の名前空間でもアクセスできるはずです - 最初の段落を参照してください。

また

「セッション Bean に @EJB アノテーションを使用して、上のリンクの FAQ で説明されているような名前を指定しました。EJB が EAR の一部である場合に適切かどうかわかりません。誰か知っていますか?」

それは結構です、それはすべてあなたが望むものに依存します。すべての名前空間と同様に、名前空間、特にグローバル名前空間の過密化を避けることを考えるかもしれません。少し考えて、決定を下してください。必要に応じて再考する準備をしてください:-)

于 2012-08-08T16:07:38.380 に答える