java - EJB3 Weblogic 10.3.6 JNDI 查找

标签 java jakarta-ee weblogic ejb-3.0 jndi

我在尝试查找 EJB3 无状态 session bean 时收到 javax.naming.NameNotFoundException:。

我有 1 个 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,其中包含我的远程接口(interface)。在这个服务器上我也有 部署了另一个 jar 文件,该文件将使用客户端 jar 的远程接口(interface)来查找 ejb。

我的EJB3在下面

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

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

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

我的ejb-jar文件如下

<?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>

weblogic-ejb 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 并不是它所绑定(bind)的。我可以看到 EAR 已成功部署在 server_2 上

任何人都可以建议我应该使用什么来查找 ejb.我已尝试以下操作,但均出现 namenotfound 异常

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

提前致谢

更新:

我将 jndi 名称更改为contractorIdBean,和以前一样,我可以在服务器上的 jndi 树中看到绑定(bind)名称 ContractorIdBean#com.ejb3.websphere.ContractorIdRemote

但这仍然会引发名称未找到异常

enter image description here

再次更新:

我将 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]

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

最佳答案

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

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 名称前缀,因此您不需要它。我相信这是用于 Tomcat 的。

关于java - EJB3 Weblogic 10.3.6 JNDI 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28091616/

相关文章:

java - 为什么没有一种简单的方法可以在 Java 中复制对象?

java - @生产者的 CDI @inject 失败

JAVA 休息服务 Jersey 返回 404

jakarta-ee - Java EE 应用程序启动失败

java - 由于不同的类加载器,在同一个耳朵中从两个不同的 war 中加载相同的类时出现 ClassCastException

eclipse - 将 WAR 文件打包到 EAR 中,以便 WAR 依赖项可用

为 JVM 指定 Java.Security 文件的 Java 参数

java方法在LDAP的ssha中进行密码加密

java - 如何检查字符串是否是由逗号分隔的 float ?

java - 如何使用 ReSTLet 创建 Atom 表示?