首页 > 解决方案 > 客户端调用 EJB 错误:javax.naming.NoInitialContextException

问题描述

从 Main 类调用我的 EJB:

MyService myService = (MyService) ctx.lookup(MyService.class.getName());

给出错误:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at com.ejb.calculator.Main.main(Main.java:26)

如何调用我的 EJB?

尝试了两种不同的 JNDI 调用:

JNDI_NAME = "java:global/ejb/MyService";
MyService myService = (MyService) ctx.lookup(JNDI_NAME);

MyService myService = (MyService) ctx.lookup(MyService.class.getName());

代码:

来源链接

https://bitbucket.org/powder366/ejb/src/master/ 

Glassfish 命令:

asadmin start-domain --verbose
asadmin stop-domain --verbose 
http://localhost:8080/
http://localhost:4848/common/index.jsf
mvn package
asadmin deploy ejb-1.0-SNAPSHOT.jar

截图:

在此处输入图像描述 在此处输入图像描述

笔记:

我的测试用例适用于嵌入式容器,但我无法调用我的外部运行容器。

使用的版本有Java8、EJB3.0、Glassfish5.0.1、Java EE8.0.1

更新 1 : 在部署 container-deploy-log.txt 期间添加了日志。请参阅 git 远程。

Update2: 将工作更改推送到 git remote。

更新 3: 将 MDB 示例推送到 git 远程。

标签: javajakarta-eeglassfishejbjndi

解决方案


首先,如果您想从外部客户端访问您的 EJB,您需要声明一个远程视图。

由于您的 EJB 只有@Local注释,因此它只提供本地视图。您应该添加@Remote注释。

@Local
@Remote
@Stateless
public class MyService implements IMyService {
    public String getMessage() {
        return "Hello!";
    }
}

全局 JNDI 名称由以下组成:

java:global/[EAR module]/[EJB module]/[EJB name]

在您的情况下,由于没有 EAR,将是:

java:global/ejb-1.0-SNAPSHOT/MyService

该测试应该有效:

Context ctx = new InitialContext();
IMyService myService = (IMyService) ctx.lookup("java:global/ejb-1.0-SNAPSHOT/MyService");
Assert.assertEquals(myService.getMessage(), "Hello!");

更新

您还需要将 glassfish 客户端库添加到类路径以运行 Main 类。

我最初使用 JUnit 测试对其进行了测试,它对我有用,因为该项目已经声明了对它的test依赖glassfish-embeded-all,包括 glassfish 客户端。test但是 IntelliJ在运行 Main 类时不会添加库。

您可以更改glassfish-embeded-allto的范围runtime或添加新的依赖项:

<dependency>
    <groupId>org.glassfish.main.appclient</groupId>
    <artifactId>gf-client</artifactId>
    <version>5.1.0</version>
    <scope>runtime</scope>
</dependency>

推荐阅读