大部头上的绝地查找

JNDI lookup on TomEE

您好,在同一个 TomEE 服务器上有一个 Web 项目和一个 EJB 项目运行。

我已经在 TomEE 服务器的 apps 文件夹中部署了 EJB 项目,并且可以在服务器启动时看到 EJB 正在启动。

INFO: Jndi(name=DefaultRegistrationProcess) --> Ejb(deployment-id=DefaultRegistrationProcess)

下面是 EJB 项目中的 @Stateless 个 bean

@Stateless(name = "DefaultRegistrationProcess")
public class DefaultRegistrationProcess implements RegistrationProcess {

    @Override
    public void process(Registration registration) {
        System.out.println("Hello from Default registration process!");
    }

}

我想从 Web 项目对 DefaultRegistrationProcess bean 进行 JNDI 查找。

通过 maven 将 EJB 与 Web 项目打包我可以使用以下代码进行 JNDI 查找。

new InitialContext().lookup("java:module/DefaultRegistrationProcess");

在单独部署 EJB 时尝试执行相同的调用时,我得到

Exception occured: Name "module/DefaultRegistrationProcess" not found. 

我浏览了 http://tomee.apache.org/documentation.html 站点并尝试了一些示例,但我仍然遇到错误。

当 EJB 部署在同一个 TomEE 服务器上时,如何从 Web 项目内部执行本地 JNDI 查找?

我必须将@Remote 添加到我的 DefaultRegistrationProcess class 实现的业务界面。

@Remote
public interface RegistrationProcess {

    public void process(Registration registration);

}

之后,我可以使用 LocalInitialContextFactory 属性 和 DefaultRegistrationProcessRemote 的 JNDI 名称进行 JNDI 查找。

 Properties p = new Properties();
 p.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.core.LocalInitialContextFactory");
 new InitialContext(p).lookup("DefaultRegistrationProcessRemote");