当前位置: 首页 > 知识库问答 >
问题:

如何使用jndi在野蝇中查找本地bean

况景龙
2023-03-14

我的问题似乎与在战争中部署的本地EJB的WildFly JNDI查找相同,只是我无法让他的解决方案工作。

我对部署在jar jaws-server-ejb3中的EJB有一个耳朵。在我的应用程序中,我想在bean上调用一个方法。我已经在我的bean上尝试了有和没有@LocalBean

野蝇(8.2)启动时打印出来:

java:global/jaws/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:app/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:module/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:jboss/exported/jaws/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:global/jaws/jaws-server-ejb3/ForecastService
java:app/jaws-server-ejb3/ForecastService
java:module/ForecastService

当我将@LocalBean添加到我的bean中时,我看到:

java:global/jaws/jaws-server-ejb3/ForecastService!com.termalabs.server.service.ForecastService
java:app/jaws-server-ejb3/ForecastService!com.termalabs.server.service.ForecastService
java:module/ForecastService!com.termalabs.server.service.ForecastService
java:global/jaws/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:app/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:module/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:jboss/exported/jaws/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote

因此,从我读到的所有内容来看,似乎很清楚,我应该能够用“java:app/jaws-server-ejb3/ForecastService”或“java:app/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote”来查找这个bean

以下是我目前硬编码的查找:

public static Object getBeanInternal(String beanName, Class remoteClass) throws NamingException {
    System.out.println("Getting internal bean: " + beanName + " for class "  + remoteClass.getName());
    final Hashtable jndiProperties = new Hashtable();
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    InitialContext ctx = new InitialContext(jndiProperties);
    Object ejb = ctx.lookup("java:app/jaws-server-ejb3/ForecastService");
//    Object ejb = ctx.lookup("java:global/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastService");
    return ejb;
}

我曾在一个空的JNDiproperty表中尝试过,或者在上面引用的设置中尝试过。无论我做了什么尝试,我最终都会遇到一个巨大的例外,比如

2015-04-07 15:50:01,836 WARN  [com.termalabs.server.system.AutosysJammerSequence] (JammerManager-2015/04/07 15:49:46.710 MDT-0) Can't lookup: javax.naming.NameNotFoundException: java:app/jaws-server-ejb3/ForecastService
    at org.jboss.as.naming.InitialContext$DefaultInitialContext.findContext(InitialContext.java:187)
    at org.jboss.as.naming.InitialContext$DefaultInitialContext.lookup(InitialContext.java:231)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:188)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:184)
    at javax.naming.InitialContext.lookup(InitialContext.java:417) [rt.jar:1.8.0_25]
    at javax.naming.InitialContext.lookup(InitialContext.java:417) [rt.jar:1.8.0_25]
    at com.termalabs.common.ejb3.EJB3Util.getBeanInternal(EJB3Util.java:55) [jaws-common-ejb3intf-1.0.jar:]
    at com.termalabs.server.system.AutosysJammerSequence.runJammerSequence(AutosysJammerSequence.java:427) [jaws-server-base-5.1dev.jar:]
    at com.termalabs.server.system.JammerSequence.run(JammerSequence.java:125) [jaws-server-base-5.1dev.jar:]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [rt.jar:1.8.0_25]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_25]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_25]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_25]

我可以使用远程接口访问这个bean,但是这似乎不对,因为我正在从同一个耳朵运行这个代码。我不需要这样做。

我错过了什么?

谢谢,

迈克尔

共有1个答案

羊舌承天
2023-03-14

查看消息,我看到JammerManager-2015/04/07 15:49:46.710 MDT-0,看起来您正在启动自己的线程。如果您没有使用新的EE并发实用程序,那么命名上下文很可能没有复制到线程中。您需要确保为新线程设置了命名上下文、安全上下文和TCCL。

 类似资料:
  • 我无法从WebLogic 10.3.6中的EJB模块中查找本地会话bean。 在下面的示例中,我可以使用注入,但在实际产品中,我们需要从非托管对象访问本地会话bean,因此这是为了演示问题。我也知道它可以与远程接口一起工作,但为什么呢?因为我应该能够在本地完成。 在这里,客户端尝试查找本地会话bean。这个非常相同的代码似乎在其他应用程序服务器中工作,但在WebLogic中不起作用。 例外:

  • 我本想把它添加到另一个线程中,但我无法评论其他帖子。我读到的没有回答我的问题。我刚刚安装了EAP 7.2.0。GA。在控制台日志中,它说: 然而,其他人认为它是在第13版左右。当我看野蝇(http://wildfly.org/downloads/)的版本时,第6版太老了,甚至没有出现,应该是在2014年之前... 那么,它怎么可能是6.0.11呢。最终的

  • 我正在运行一个Web应用程序,它是一个rest API,我正在使用Wildfly 9.0.2和PostgreSQL。数据库连接使用最新的jdbc4.2驱动程序,jre是oracle的jr8。 我根据这个主题安装了jdbc,并且运行得很好。到目前为止,我使用wildfly管理控制台安装了数据源。 因此,当我尝试插入json字段时,问题出现了。我很快意识到JDBC没有直接的方法来插入json字段,比如

  • 我想从詹金斯那里向wildfly部署一个war文件。我尝试了很多方法,但都不管用 我使用了将WAR/EAR部署到wildfly插件,但它对我不起作用,我得到了错误: (致命:无法初始化命令上下文。生成步骤“将WAR/EAR部署到WildFly”将生成标记为失败已完成:失败), 我搜索了那个问题,但给出的答案对我没有帮助。 在我使用将WAR/EAR部署到容器的构建后操作中,它对我也不起作用,我得到了

  • 我使用的是WildFly 8.1.0最终版本。 我的应用程序是一个部署在WAR中的JavaEE web应用程序(没有EJB模块.ear)。 我想使用JNDI以编程方式调用带有他的名字的本地EJB。 EJB只是用@无状态注释(没有本地或远程接口) 我尝试以下功能: 但它不起作用(显然是针对远程EJB的) 但我没有找到任何与WildFly发生战争的本地EJB示例,我也不知道该怎么做,我不经常使用JND

  • 我有一个web应用程序部署为使用Wildfly的爆炸战争。我想要得到的是 null 目前,我所处的情况是,我可以选择其中一个或另一个,但不能同时获得这两个选项(这意味着,要么每个jsp更改都强制进行新的部署,要么.class文件不强制进行新的部署)。 wildfly的当前配置(使用版本8.1.0)为 此外,我还发现,无论我在deployment-scanner配置中设置了什么,一旦服务器启动并运行