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