0

NetBeans を使用して、Oracle Web サイトの Java EE 6 チュートリアルに示されているショッピング カートの例を正常に実行できました。これは、EJB モジュールとアプリケーション クライアント モジュールの 2 つのモジュールを持つ EAR です。私が直面している混乱に焦点を当てるために、コードの詳細をいくつか省略しました。まず、以下がコードです。

EJB モジュールのリモート インターフェース

package cart.ejb;

import cart.util.BookException;
import java.util.List;
import javax.ejb.Remote;

@Remote
public interface Cart {
  public void initialize(String person) throws BookException;

  public void initialize(
     String person,
     String id) throws BookException;

  public void addBook(String title);

  public void removeBook(String title) throws BookException;

  public List<String> getContents();

  public void remove();
}

EJB モジュールのステートフル セッション Bean

package cart.ejb;

import cart.util.BookException;
import cart.util.IdVerifier;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Remove;
import javax.ejb.Stateful;


@Stateful
public class CartBean implements Cart {
  List<String> contents;
  String customerId;
  String customerName;

  public void initialize(String person) throws BookException {
   .................
  }

  public void initialize(
     String person,
     String id) throws BookException {
   .....................
  }

  public void addBook(String title) {
    contents.add(title);
  }

  public void removeBook(String title) throws BookException {
    .................
  }

  public List<String> getContents() {
    return contents;
  }

  @Remove()
  public void remove() {
    contents = null;
  }
}

アプリケーション クライアント モジュールのクライアント

package cart.client;

import java.util.Iterator;
import java.util.List;
import javax.ejb.EJB;
import cart.ejb.Cart;
import cart.util.BookException;


public class CartClient {
   @EJB
   private static Cart cart;

   public CartClient(String[] args) {
   }

   public static void main(String[] args) {
     CartClient client = new CartClient(args);
     client.doTest();
   }

   public void doTest() {
     ..................
   }
}

今、私の混乱が始まります!!

混乱-1:チュートリアルでは、リモート クライアントであると説明されています。そうではありません!これは、EJB モジュールと同じ EAR 内にモジュールとしてパッケージ化されています。@Local の方が適切ではないでしょうか?

混乱-2: Glassfish がそれをクライアントとセッション Bean 間のリモート通信と見なす場合、クライアントのコンテナーは、EJB コンテナー内のセッション Bean の実際のインスタンスを表すセッション Bean の偽のインスタンス (つまり、プロキシ) を提供しますか? 「本物の」リモートケースのように?つまり、リモートはリモートを意味しますが、どうでもいいですか?

混乱-3:非 EE 環境でクライアントを作成し、それを EAR の外部から Bean と通信させて、「本物の」リモートを体験することを考えています。では、Eclipse を起動し、クライアントからコンテンツを EAR にコピーして Java SE 7 クライアント プログラムを作成する場合、これらの変更を行う必要がありますか?

依存性注入を置き換える

@EJB
private static Cart cart;

JNDIで

private static Cart cart = (Cart) InitialContext.lookup("java:global/cart/cart-ejb/CartBean/Cart");

Java Standard Edition クライアント プロジェクトに Cart インターフェイスのソース コードを追加します。

混乱-4:その EAR ファイルの場所が見つかりません。NetBeans では、カートの下に 2 つの jar ファイルがあることがわかります。しかし、EAR ファイルはどこにあるのでしょうか。C:\glassfish-4.1.1\docs\javaee-tutorial\examples\ejb\cartから NetBeansでプロジェクトを直接開いてデプロイしました。

4

1 に答える 1

0
  1. @Local で十分です。はい、どうやら彼らはデモンストレーションに怠惰で、すべてを 1 つにパッケージ化することを選択したようです。いずれにせよ、デプロイメント ユニットは @Local インターフェースのスコープであるため、同じコンテナー内の 2 つの異なる EARS は相互の @Local インターフェースにアクセスできませんでした。

  2. はい、いいえ: 外部の動作は実際のリモート ケースと完全に同じになります (オブジェクトのシリアル化とプロキシを使用)。私の知る限り、ほとんどのコンテナーは、@Remote であっても同じ JVM にあるという事実を利用するため、たとえば、実際のリモート ソケット接続は行われません。

3.

  • Bean のリモート インターフェイスが必要です
  • 特定の資格情報を使用して特定のポートでリモート呼び出しを許可するように Glassfish を構成する
  • このセットアップに対して JNDI ルックアップを実行します
于 2016-02-28T09:52:15.267 に答える