2

我有一个名为“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");

我不知道这里发生了什么...

4

1 回答 1

5

远程接口(以及一般的接口)的原理是,具有对实现给定接口的对象的引用的客户端不需要知道对象的具体类型。如果他知道接口,他就会调用接口中定义的方法。

在您的界面中定义方法,否则它没有任何意义。

并在该接口上调用方法:

BookEJBRemote book = (BookEJBRemote) ctx.lookup("java:global/classes/BookEJB");
int pages = book.getNumberOfPages();

EJB 容器用实现其接口的对象包装每个 EJB,并委托给实际的 EJB bean 实例。但在调用 EJB bean 实例上的方法之前,它确保事务已启动,调用者有权调用方法等。

在远程接口的情况下,客户端可以存在于单独的 JVM 中,甚至无法访问 BookEJB 类。它只接收一个实现远程接口的存根类的实例。当调用方法时,存根序列化参数,向服务器发送网络请求,从服务器获取响应,反序列化,并将结果返回给调用者。BookEJB 实例仅存在于服务器 JVM 中。

于 2012-05-01T06:52:41.197 回答