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でプロジェクトを直接開いてデプロイしました。