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

EJB3 Weblogic 10.3.6 JNDI查找

魏誉
2023-03-14

我得到一个javax。命名。NameNotFoundException:在尝试查找EJB3无状态会话bean时。

我有一个weblogic域,它包括两个服务器Server_1和server_2。我已经将一个EAR文件部署到server_2其中包含一个EJB3部署。它里面有以下内容

EJB3 EAR file
----EJB3 Module Jar file
    ------Stateless session EJB3 bean 
----META-INF Folder
    -- application.xml file
----lib folder
    -------EJB3 Client jar holding containing remote  and local interface

EJB3模块jar文件包括以下内容

EJB3 JAR file
    ----package structure of EJB3 Stateless bean and bean 
    ----META-INF folder
        -----weblogic-ejb-jar.xml
        -----ejb-jar.xml. 

在服务器1上,我部署了EJB3客户机Jar,其中包含我的远程接口。在这个服务器上,我还部署了另一个jar文件,它将使用客户端jar的远程接口来查找ejb。

我的EJB3在下面

@Remote
public interface ContractorIdRemote {
    public String test();
}

@Stateless(name="ContractorIdBean", mappedName="ContractorIdBean")
public class ContractorIdBean implements ContractorIdRemote {

    public String test() {
        .........
    }
}

我的ejbjar文件如下

<?xml version="1.0" encoding="ASCII"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0">
<display-name>ejb</display-name>
<enterprise-beans>
     <session>
          <ejb-name>ContractorIdBean</ejb-name>
          <ejb-ref>
               <ejb-ref-name>ContractorIdBean</ejb-ref-name>
               <remote>com.ejb3.websphere.ContractorIdRemote</remote>
               <mapped-name>ContractorIdBean</mapped-name>
          </ejb-ref>
     </session>
</enterprise-beans>
</ejb-jar>

WebLogicEJB xml文件

<?xml version="1.0"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC
'-//BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB//EN'
'http://www.bea.com/servers/wls600/dtd/weblogic-ejb-jar.dtd'>

<weblogic-ejb-jar>


    <weblogic-enterprise-bean>
        <ejb-name>ContractorIdBean</ejb-name>
        <jndi-name>ejb/ContractorIdBean</jndi-name>
    </weblogic-enterprise-bean>



</weblogic-ejb-jar>

我的查找是从调用客户端执行的,如下所示

Context ctx = new InitialContext(properties);
ContractorIdRemote cRemote = (ContractorIdRemote)ctx.lookup("ejb/ContractorIdBean");
cRemote.test();

我的属性文件包含以下内容

java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=t3://localhost:17001

但显然ejb/ContractorIdBean并不是它所绑定的。我可以看到EAR已成功部署到服务器2上

谁能告诉我应该用什么来查找ejb。我尝试了以下方法,但均未发现异常

java:comp/env/ejb/ejb/ContractorIdBean
java:comp/env/ejb/ContractorIdBean

提前谢谢

更新:

我把我的jndi名称改成了仅仅是承包商IdBean,就像以前一样,我可以在服务器上的jndi树中看到绑定名称承包商IdBean#com.ejb3.websphere.承包商IdRemote

但这仍然抛出一个名称未找到异常

再次更新:

我将jndi名称更改为上面的屏幕截图,并添加了服务器的安全凭据。在此之后,我现在得到以下异常

javax.naming.CommunicationException [Root exception is java.rmi.UnmarshalException: failed to unmarshal class java.lang.Object; nested exception is: 
    java.lang.ClassNotFoundException: com.ejb3.websphere.ContractorIdRemote]

我不知道为什么它找不到类。我还将其包含在服务器2上部署的EAR文件中以及服务器1上的ejb客户机jar中

共有1个答案

饶曦之
2023-03-14

对于远程查找(从一台服务器到另一台服务器),您应该执行以下操作:

Hashtable<String, String> h = new Hashtable<String, String>();
h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, url);
h.put(Context.SECURITY_PRINCIPAL, username);
h.put(Context.SECURITY_CREDENTIALS, password);

InitialContext context = new InitialContext(h);
cId= (ContractorIdRemote) context.lookup("ejb/ContractorIdBean");

Weblogic不使用comp/env作为JNDI名称的前缀,因此您不需要它。我相信这是用来形容雄猫的。

 类似资料:
  • 我刚开始在DynamoDB上建一个社交网站。 我将有相当数量的数据与一个用户相关,我计划将这些全部放入一个表中--例如: 用户ID 出生日期 头发 照片URL 详细信息 可能有几百个属性。 问题: 将这么多数据放入一个表中有什么问题吗? 我如何查询该数据(我是否可以执行类似这样的查询:“所有在这个年龄,这个颜色头发,这个位置,并且这次登录的成员)-假设所有这些数据都包含在表中? 如果一个表的内容很

  • 以下策略可用于仓库基础结构来解决查询。你可以在XML配置中的命名空间通过query-lookup-strategy属性来配置策略或者在JAVA配置中通过Enable${store}Repositories声明queryLookupStrategy属性。有些策略可能对于特别的datastores并不支持。 CREATE 从查询方法名来尝试构建一个特别的数据查询。一般的方法都是从方法名称中移除已知设定

  • 主要内容:UnionFind1.java 文件代码:本小节基于上一小节并查集的结构介绍基础操作,查询和合并和判断是否连接。 查询元素所在的集合编号,直接返回 id 数组值,O(1) 的时间复杂度。 ... private int find ( int p ) {     assert p >= 0 && p < count ;     return id [p ] ; } ... 合并元素 p 和元素 q 所属的集合, 合并过程需要遍历一遍所有元素

  • 程序员经常要处理数组中存放的大量数据,可能需要确定数组是否包含符合某关键值(key value)的值。寻找数组中某个元素的过程称为查找(searching)。本节介绍两个查找方法:简单的线性查找(liner search)方法和更复杂的折半查找(binary search)方法。练习4.33和练习4.34要求用递归法实现线性查找与折半查找。 图4.19 的线性查找比较数组中每个元素与查找键(sea

  • 问题内容: 如何获取使用SQL Server的SQL查询返回的列数? 例如,如果我有如下查询: 它应该返回表A1中的总列数+表A2中的总列数。但是查询可能会更复杂。 问题答案: 这是一种方法: 您可以通过创建视图来执行类似的操作。

  • 这里是一些非常常见的常见问题: 似乎没有一个 Keys(...) 或者 Scan(...) 方法? 如何查询数据库中存在哪些键? 或者 似乎没有一个 Flush(...) 方法?如何删除数据库中的所有的键? 很奇怪的是,这里的最后一个关键词是数据库。 因为StackExchange.Redis的目标是针对集群等场景,知道哪些命令针对 数据库 (可以是分布在多个节点上的逻辑数据库)以及哪些命令针对

  • 工作空间中查找 Eclipse 查找对话框中可以允许用户在指定工作空间上使用单词或字母模式来查找文件。 或者你可以在指定项目或在 package explorer 视图上选择好指定文件夹来查找。 可通过以下方式来调用查找框: 在 Search 菜单上选择 Search 或 File 或 Java 按下快捷键: Ctrl + H 文件(File)查找允许用户查找所有文件类型,而 Java 查找只针对

  • 我们要编写的下一个函数是find,它的作用是在纸牌向量中查找指定的牌。这个函数的用途可能不是那么明显,但是我们可以利用它来演示两种查找方法,即线性查找和二分查找。 线性查找是比较直观的一个;它包括遍历牌堆并拿每张牌和我们要找的牌进行比较。如果找到了,返回纸牌出现位置的索引;没找到则返回-1。 int find (const Card& card, const apvector<Card>& dec