我在使用JNDI检索bean时遇到了问题。为什么我不能通过JNDI使用远程接口访问我的EJB?
我有2个耳朵:clientear和workerear。 Clientear包含clientejb和libejb Workerear包含workerejb和libejb
的LIB包含MyInterface的 的workerejb包含豆和抽象类 和clientejb包含执行查找客户端代码。
我Bean上实现远程接口
public class MyBean implements MyInterface
其JNDI绑定
java:global/jndinaming/MyBean!learning.jndinaming.MyInterface
这是确定的。
现在我想它来扩展一个抽象类:
public abstract class MyAbstractClass implements MyInterface
public class MyBean extends MyAbstractClass
所以JNDI绑定成为
java:global/jndinaming/MyBean!learning.jndinaming.MyBean
这是确定的,我调整了字符串和我的代码是这样的:
(MyInterface) ctx.lookup("java:global/jndinaming/MyBean!learning.jndinaming.MyInterface");
成为这样:
(MyInterface) ctx.lookup("java:global/jndinaming/MyBean!learning.jndinaming.MyBean");
我也得到一个类转换异常:
ClassCastException异常:不能投为myBean $$$ view68(ID = 938),以 MyInterface的
接口文件是在一个项目,该项目可由客户和工人项目访问。
客户端项目包含调用查找方法的代码。
worker项目有bean实现和抽象类。
这些项目位于不同的耳朵文件中,但位于相同的野蝇容器中。
为什么添加新的“图层”与抽象类会导致此类抛出异常?我能做些什么来解决它?
BTW: 尝试使用在nameNotFound例外
(MyInterface) ctx.lookup("java:global/jndinaming/MyBean!learning.jndinaming.MyInterface");
结果访问被抛出
编辑: 这是豆,抽象类和接口的当前状态:
接口:
import javax.ejb.Remote;
@Remote
public interface MyInterface {
public void print();
}
抽象类:
public abstract class MyAbstractClass implements MyInterface{
}
为myBean
@Stateless
public class MyBean extends MyAbstractClass{
@Override
public void print() {
System.out.println("MyAbstractClassExtender.PRINT");
}
}
客户机代码:
@Stateless
public class TimedBean {
@Resource
private SessionContext ctx;
@Schedule(second="*/10", minute="*", hour="*")
public void run() throws NamingException{
MyInterface c2 = (MyInterface) ctx.lookup("java:global/workerear/workerejb-0.0.1-SNAPSHOT/MyAbstractClassExtender!learning.lib.MyInterface");
c2.print();
}
}
请给你的每个类/接口上 – Phuthib
当然,我会后整个代码在这里 – JSBach