java - 为什么我无法通过 JNDI 使用远程接口(interface)访问我的 EJB?

标签 java jakarta-ee jndi wildfly-8

我在使用 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/

相关文章:

java - CDI 为 bean 选择正确的范围

java - 关于我的错误,如何在 tomcat 中配置 jndi?

java - 如何使用 arraylist 根据用户定义的排序对类对象进行排序?

java - 使用 Java 从 Mongo 中的文档获取 dbref

java - 如何将 log4j 输出打印到日志文件中?

java - 需要 Spring Web 服务客户端教程或示例

tomcat - Birt 报告部署为连接 URL "Cannot create JDBC driver of class ' 返回 'null'“

maven - mvn :jetty unable to load WebAppContext

Java 将属性和值附加到现有 XML

java - 使用GroupLayout时如何给组件添加边框?