我在使用 JNDI 检索 Bean 时遇到问题。
我有两只耳朵:客户耳和 worker 耳。 clientear包含clientejb和libejb Workerear包含workerejb和libejb
该库包含 MyInterface workerejb 包含 bean 和抽象类 clientejb 包含执行查找的客户端代码。
我的bean实现了远程接口(interface)
public class MyBean implements MyInterface
它的 JNDI 绑定(bind)是
java:global/jndinaming/MyBean!learning.jndinaming.MyInterface
没关系。
现在我希望它扩展一个抽象类:
public abstract class MyAbstractClass implements MyInterface
public class MyBean extends MyAbstractClass
因此 JNDI 绑定(bind)变为
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");
我得到了一个 Class Cast 异常:
ClassCastException: Cannot cast MyBean$$$view68 (id=938) to MyInterface
接口(interface)文件位于客户端和工作项目都可以访问的项目中。
客户端项目包含调用查找方法的代码。
worker 项目有 bean 实现和抽象类。
这些项目位于不同的ear文件中,但位于同一个wildfly容器中。
为什么用抽象类添加新的“层”会导致此类抛出异常?我该怎么做才能解决这个问题?
顺便说一句: 尝试使用访问 (MyInterface) ctx.lookup("java:global/jndinaming/MyBean!learning.jndinaming.MyInterface");
导致抛出 nameNotFound 异常
编辑: 这是 bean、抽象类和接口(interface)的当前状态:
界面:
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();
}
}
最佳答案
从接口(interface)中删除@Remote并将其添加到bean中可以解决问题:
public interface MyInterface {
public void print();
}
@Stateless
@Remote(MyInterface.class)
public class MyBean extends MyAbstractClass{
@Override
public void print() {
System.out.println("MyAbstractClassExtender.PRINT");
}
}
那么 JNDI 绑定(bind)将是这样的:
java:global/workerear/workerejb-0.0.1-SNAPSHOT/MyBean!learning.lib.MyInterface
Actor 阵容也很出色。
关于java - 为什么我无法通过 JNDI 使用远程接口(interface)访问我的 EJB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31519746/