如何在单独的Web应用程序中访问EJB实现远程接口?

时间:2010-03-10 14:31:00

标签: java web-applications java-ee ejb-3.0 module

我正在使用Netbeans 6.8和Glassfish v3.0。

我创建了一个ejb模块并从数据库创建了实体类,然后使用远程接口创建了无状态会话bean。比如说。

 @Remote
public interface customerRemote{
    public void add(String name, String address);
    public Customer find(Integer id);
}

@Stateless
public class customerBean implements customerRemote{
    //implementations of methods
}

然后我创建了一个新的Web应用程序。但是现在如何在我的Web应用程序中访问远程ejb。我可以用jndi名称查找一个bean,但我想知道的是,它将返回什么类型的对象?我如何在customerRemote中进行类型转换?我的Web应用程序中没有任何名为customerRemote的类。那么,我该怎么做?另外,实体类客户怎么样?我的Web应用程序中也没有名为Customer的类。所有ejb和实体类都在单独的ejb模块中。请帮帮我:(

2 个答案:

答案 0 :(得分:11)

  

我如何对其进行类型转换   customerRemote?我没有任何课程   在我的网站上命名为customerRemote   应用。那么,我该怎么做?也,   那么实体类客户呢?   没有名为Customer的类   在我的Web应用程序中也是。所有的ejb   和实体类是分开的ejb   模块。

您的Web应用程序必须依赖于包含这些类和接口的库。然后你就可以像往常一样导入界面和类型转换。你有两种方法:

  • 所有在一个罐子里。这似乎是你现在拥有的。在这种情况下,您的Web应用程序需要依赖此jar。

  • 拆分API和实施。更好的方法是将ejb模块拆分为两个jar:一个ja​​r myModule-api包含属于模块API的类。在这种情况下,customerRemoteCustomer。另一个jar myModule-impl包含实现(当然,实现依赖于API)。然后在您的网络应用中,您只需要依赖myModule-api中的API。

答案 1 :(得分:1)

我正在使用Eclipse 3.5.2,EJB 3.0和GlassFish 2.1,但我确信这对你也有用。

首先,我创建了一个EJB项目,该项目将作为独立的EJB模块部署在容器上,另一个项目实际上是一个使用单个servlet进行测试的Web应用程序。

我可以解决在调用bean的servlet上为@EJB声明添加下一个参数时遇到的相同问题:

public class SimlpeServletClient extends HttpServlet {
.
.
.
@EJB(beanInterface=ISimpleJob.class,mappedName="ISimpleJob")
ISimpleJob statelesBean;
.
.
.
protected void doPost(HttpServletRequest ...){...}

.
.
.
}

这是实现暴露给servlet的接口的bean的结构:

@Stateless(name="SimpleJobBean", mappedName="ISimpleJob")
@Remote( { ISimpleJob.class })
public class SimpleJobBean implements ISimpleJob {
.
.
.
}

正如您所看到的,您的客户端似乎只知道要使用的接口,但它并不告诉服务器哪个资源可以满足请求。