我有一个名为“BookEJB”的EJB,它实现了一个远程接口“BookEJBRemote”
BookEJB声明如下:
@Stateless
@Remote(BookEJBRemote.class)
public class BookEJB implements BookEJBRemote{}
BookEJBRemote声明如下:
@Remote
public interface BookEJBRemote
{}
我有一个进行单元测试的文件,运行测试时出错。 错误消息如下:
java.lang.ClassCastException: _BookEJBRemote_Wrapper cannot be cast to BookEJB
并且出错的行是:
BookEJB mediaEJB = (BookEJB) ctx.lookup("java:global/classes/BookEJB");
我不知道这里发生了什么......
答案 0 :(得分:5)
远程接口(以及通常的接口)的原理是,具有对实现给定接口的对象的引用的客户端不需要知道对象的具体类型。如果他知道界面,他会调用界面中定义的方法。
在界面中定义方法,否则没有任何意义。
并在此界面上调用方法:
BookEJBRemote book = (BookEJBRemote) ctx.lookup("java:global/classes/BookEJB");
int pages = book.getNumberOfPages();
EJB容器用一个实现其接口的对象包装每个EJB,并委托给实际的EJB bean实例。但是在调用EJB bean实例上的方法之前,它确保事务已启动,调用者有权调用方法等。
对于远程接口,客户端可以位于单独的JVM中,甚至无法访问BookEJB类。它只接收实现远程接口的存根类的实例。存根,当调用方法时,序列化参数,向服务器发送网络请求,从服务器获取响应,反序列化它,并将结果返回给调用者。 BookEJB实例仅存在于服务器JVM中。