【问题标题】:Client call to EJB error: javax.naming.NoInitialContextException客户端调用 EJB 错误:javax.naming.NoInitialContextException
【发布时间】:2020-04-19 16:33:58
【问题描述】:

从 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());

代码:

Source link

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 远程。

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

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

【问题讨论】:

    标签: java jakarta-ee glassfish ejb jndi


    【解决方案1】:

    首先,如果你想从外部客户端访问你的 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 测试对其进行了测试,它对我有用,因为该项目已经声明了对 glassfish-embeded-alltest 依赖项,其中包括 glassfish 客户端。但是 IntelliJ 在运行 Main 类时不会添加 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>
    

    【讨论】:

    • 不幸的是同样的错误,你所说的JNDI是正确的,在部署时将其作为日志输出。运行 Main 类时,容器日志中不会显示任何内容。可能永远不会到达容器。与上述问题相同的错误...远程 git 的更改。还添加了日志文件 container-deploy-log.txt
    • 你是在运行另一个项目的测试类吗?
    • 这是从 IntelliJ bitbucket.org/powder366/ejb/src/master/src/main/java/com/ejb/… 开始的主类,我的 Glassfish 在我的同一台计算机 mac(IntelliJ 之外)上独立运行。使用: asadmin deploy ejb-1.0-SNAPSHOT.jar 在 Unix 命令行上进行部署。
    • 好的。没有看到那个类,并且正在查看 test/ 目录。我会将缺失的部分添加到答案中
    • 很高兴它成功了。请问可以放赏金吗? ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多