使用 NetBeans,我成功运行了 Oracle 网站上 Java EE 6 教程中介绍的购物车示例。它是一个具有两个模块的 EAR:一个 EJB 模块和一个应用程序客户端模块。我已经缩短了代码的一些细节,以便专注于我面临的困惑。首先,下面是代码。
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() {
..................
}
}
现在我的困惑开始了!!
Confusion-1:教程说它是一个远程客户端。但事实并非如此!它与 EJB 模块被打包为同一个 EAR 中的一个模块。@Local 不是更合适吗?
困惑2:如果 glassfish 确实认为它是客户端和会话 bean 之间的远程通信,那么客户端的容器是否会提供会话 bean 的假实例(即代理),代表 EJB 容器中会话 bean 的实际实例,只是就像在“真实”的远程案例中一样?我的意思是,远程是否意味着远程,无论如何?
Confusion-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");
并将 Cart 接口的源代码添加到 Java 标准版客户端项目中。
Confusion-4:我找不到那个 EAR 文件的位置。在 NetBeans 上,我可以看到购物车下有两个 jar 文件。但是,EAR 文件在哪里?我通过使用 NetBeans从C:\glassfish-4.1.1\docs\javaee-tutorial\examples\ejb\cart直接打开项目来部署该项目。