我正在获取javax.naming.NameNotFoundException:尝试查找EJB3无状态会话bean时。
我有1个weblogic域,它由两个服务器Server_1和server_2组成。我已经将EAR文件部署到由EJB3部署组成的server_2上。它里面有以下内容
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() {
.........
}
}
我的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不是它所绑定的。我可以看到EAR已成功部署在server_2上
任何人都可以建议我应该使用什么来查找ejb。我已经尝试了以下方法,但都带有namenotfound异常
java:comp/env/ejb/ejb/ContractorIdBean
java:comp/env/ejb/ContractorIdBean
提前致谢
更新:
我将jndi名称更改为只是contractorIdBean,就像以前在服务器上的jndi树中看到绑定名称ContractorIdBean#com.ejb3.websphere.ContractorIdRemote
但这仍会引发“找不到名称”异常
再次更新:
我将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不会在JNDI名称前添加
comp/env
前缀,因此您不需要这样做。我相信这是用于Tomcat的。