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

jBoss EAR-EJB jndi java:全局工作,java: app NameNotFoundExc0019

赏光霁
2023-03-14

我们有一个EAR,其中包含一些JAR、一个EJB模块和一个WAR模块。我们希望获得一个具有JNDI InitialContext的类。查找同一EJB模块中的和。

在jBoss控制台中,我们可以看到java:global与应用程序、模块以及模块内的所有类。如果我们这样做查找,它就会工作。还有一个应用程序部分,包括我们的EAR和模块以及其中的所有类。

现在我们的EAR可以有不同的执行,因此有不同的二进制名称,我们想使用java:app跳过硬编码的AppName。令我们惊讶的是,即使java:app存在于jBoss控制台JNDI清单中,它也始终抛出NameNotFoundException。我们还尝试了java:comp、java:module、java:app/env/。。。(即使它们没有显示在jBoss控制台中),但除了可移植名称之外,其他都不起作用。

有人知道为什么会这样吗?

private static final String MY_TIMER_SINGLETON = "java:global/myear-1.0.0-SNAPSHOT/mymoduleejb/MyTimerSingleton";

//private static final String MY_TIMER_SINGLETON = "java:app/mymoduleejb/MyTimerSingleton";

InitialContext ic = new InitialContext();
MyTimerSingleton t = (MyTimerSingleton) ic
        .lookup(MY_TIMER_SINGLETON);

JBoss控制台配置文件-

java:jboss
 -...

java:global
 -myear-1.0.0-SNAPSHOT
  -mymoduleejb
   -MyTimerSingleton
   -...

applications
 -myear-1.0.0-SNAPSHOT
  -java:app
   -mymoduleear
    -MyTimerSingleton
    -...

编辑1:附加信息。

jBoss正在使用独立的ha运行。xml配置

我正试图通过JDNI获得单例,因为@EJB在org中不起作用。jboss。理学硕士。服务服务类。

如果我让MyTimerSingleton实现@Remote或@Local接口,JBoss控制台的JNDI将变为空。

无论如何,所有的/JNDI列表的env/为空

共有1个答案

华欣怡
2023-03-14

我假设MyTimerSingleton是一个EJB,如果是,那么你不需要JNDI,你可以使用@EJB注释,甚至从耳朵里面的网络模块调用EJB。

...
@Stateless
public class OtherEJB {
@EJB
MyTimerSingleton myTimerSingleton;
...

如果您不希望使用JNDI调用实现松散耦合的解决方案,请尝试使用EJB MyTimerSingleton中的@无状态或@Singleton批注中的mappdName属性:

...
import javax.ejb.Singleton;
@Singleton(mappedName = "MyTimerSingleton")
public class MyTimerSingleton implements MyTimerSingletonDef {
...

您还需要编写/生成EJB@本地或@远程接口。

...    
@Remote
public interface MyTimerSingletonDef {
...

mappedName支持的JavaEE提供程序实现可能不同,通常EJB模块的JNDI名称如下:Java:module/EJBMappedName属性!规范化ejb接口名称或java:module/ejb mappedName属性#规范化ejb接口名称,因此您将得到如下内容:

java:module/MyTimerSingleton!example.package.MyTimerSingletonDef

或者这个

java:module/MyTimerSingleton#example.package.MyTimerSingletonDef

根据这个博客,以及JBoss和WildFly的JBoss文档

由于JavaEE 6,EJB组件的JNDI名称语法具有以下结构:

[/<application-name>]/<module-name>/<bean-name>[!<full-qualified-interface-name>]

默认情况下,应用程序名称是企业存档的文件名。因此,建议在应用程序中配置应用程序名称。企业存档的xml部署描述符,如下所示。

<application xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee  http://xmlns.jcp.org/xml/ns/javaee/application_7.xsd"
        version="7">
    <application-name>myapp</application-name>
    ...
</application>

还建议配置ejb模块的模块名。否则,模块名默认为ejb归档文件的文件名。可以使用ejbjar配置模块名。xml部署描述符。

<ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd"
    version="3.2">
    <module-name>remote</module-name>
</ejb-jar>

根据规范,EJB组件将在名称空间java:global、java:app和java:module中注册。

所以你会在服务器控制台得到这样的东西:

java:global/myapp/remote/MyTimerSingleton!example.package.MyTimerSingletonDef
java:app/myapp/remote/MyTimerSingleton!example.package.MyTimerSingletonDef
java:module/myapp/MyTimerSingleton!example.package.MyTimerSingletonDef

因此,解决方案可能是将应用程序(在application.xml中)和ejb模块(ejb jar.xml)名称配置为始终获得相同的可移植JNDI名称。

 类似资料:
  • 导演类 成员变量 变量 类型 名称 备注 screenScale number 屏幕比例 renderSize Object 屏幕逻辑大小 screenPixelSize Object 屏幕实际像素大小 root Object 根节点 fps number 游戏实时帧率 logToConsole number 输出至控制台 置为1会将log输出至控制台 例子: //屏幕比例 var scale =

  • 我目前正在Mac上的Spring Tool Suite中开发多个大型webapp(每个webapp在运行时实际上包含3-7个eclipse项目)。每个导入的webapp在导入和项目验证完成后都有几个错误。maven构建将不断失败,直到我右键单击与给定webapp关联的每个项目并选择maven->Disable Workspace Resolution。我可以考虑运行maven clean、mave

  • 为了将节点库(uuid)用作我正在使用的其他软件的命令行工具,我通过全局安装了该库,并通过测试了安装,但我得到了一个错误,全局安装显然无法正常工作。如果我在本地保存库,在目录上运行相同的命令,它确实有效,所以问题显然是全局安装。这有什么不好?

  • 问题内容: 我试图在某些函数中声明一些全局变量,然后将具有这些函数的文件导入另一个函数。但是,我发现在第二个文件中运行该函数不会创建全局变量。我尝试创建另一个具有相同名称的变量,但是当我打印出该变量时,它将打印出第二个文件的值,而不是全局值 globals.py main.py 这将打印0。如果我没有main,程序将出错(值未定义)。 如果我在函数外部声明,将采用global的值,而不是在中设置的

  • 我们正在运行一个Kafka0.11.0的6节点集群。我们设置了全局保留和每个主题保留(以字节为单位),但这两个保留都没有应用。我在日志中没有看到任何错误,只是没有被删除(按大小;时间保留似乎起作用了) 我可以看到在分区目录中有大量的段日志文件(每个512MB)...怎么回事?! 谢谢你,雷鸣

  • 4. 全局变量、局部变量和作用域 我们把函数中定义的变量称为局部变量(Local Variable),由于形参相当于函数中定义的变量,所以形参也是一种局部变量。在这里“局部”有两层含义: 1、一个函数中定义的变量不能被另一个函数使用。例如print_time中的hour和minute在main函数中没有定义,不能使用,同样main函数中的局部变量也不能被print_time函数使用。如果这样定义: