Client call to EJB error: javax.naming.NoInitialContextException
Client call to EJB error: javax.naming.NoInitialContextException
正在从 class 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、JavaEE8.0.1
更新 1:
在 deplyoment container-deploy-log.txt 期间添加了日志。请参阅 git 远程。
更新2:
将工作更改推送到 git 远程。
更新3:
将 MDB 示例推送到 git 远程。
首先,如果你想从外部客户端访问你的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 客户端库添加到 运行 主 class 的 class 路径。
我最初使用 JUnit 测试对其进行了测试,它对我有用,因为该项目已经声明了对 glassfish-embeded-all
的 test
依赖性,其中包括 glassfish 客户端。但是 IntelliJ 在 运行 主 class.
时不会添加 test
库
您可以将 glassfish-embeded-all
的范围更改为 runtime
或添加新的依赖项:
<dependency>
<groupId>org.glassfish.main.appclient</groupId>
<artifactId>gf-client</artifactId>
<version>5.1.0</version>
<scope>runtime</scope>
</dependency>
正在从 class Main:
调用我的 EJBMyService 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、JavaEE8.0.1
更新 1: 在 deplyoment container-deploy-log.txt 期间添加了日志。请参阅 git 远程。
更新2: 将工作更改推送到 git 远程。
更新3: 将 MDB 示例推送到 git 远程。
首先,如果你想从外部客户端访问你的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 客户端库添加到 运行 主 class 的 class 路径。
我最初使用 JUnit 测试对其进行了测试,它对我有用,因为该项目已经声明了对 glassfish-embeded-all
的 test
依赖性,其中包括 glassfish 客户端。但是 IntelliJ 在 运行 主 class.
test
库
您可以将 glassfish-embeded-all
的范围更改为 runtime
或添加新的依赖项:
<dependency>
<groupId>org.glassfish.main.appclient</groupId>
<artifactId>gf-client</artifactId>
<version>5.1.0</version>
<scope>runtime</scope>
</dependency>