我正在使用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模块中。请帮帮我:(
答案 0 :(得分:11)
我如何对其进行类型转换 customerRemote?我没有任何课程 在我的网站上命名为customerRemote 应用。那么,我该怎么做?也, 那么实体类客户呢? 没有名为Customer的类 在我的Web应用程序中也是。所有的ejb 和实体类是分开的ejb 模块。
您的Web应用程序必须依赖于包含这些类和接口的库。然后你就可以像往常一样导入界面和类型转换。你有两种方法:
所有在一个罐子里。这似乎是你现在拥有的。在这种情况下,您的Web应用程序需要依赖此jar。
拆分API和实施。更好的方法是将ejb模块拆分为两个jar:一个jar myModule-api
包含属于模块API的类。在这种情况下,customerRemote
和Customer
。另一个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 {
.
.
.
}
正如您所看到的,您的客户端似乎只知道要使用的接口,但它并不告诉服务器哪个资源可以满足请求。