【发布时间】:2015-11-05 02:27:04
【问题描述】:
您好,我正在尝试使用 JNDI 访问 EJB 组件。为此,我编写了一个名为 HelloWorld 的简单程序。
远程接口
public interface HelloWorldEJB extends EJBObject {
public String sayHello() throws RemoteException;
}
主页界面
public interface HelloWorldEJBHome extends EJBHome {
HelloWorldEJB create() throws RemoteException, CreateException;
}
实施
public class HelloWorldEJBBean implements SessionBean {
private SessionContext _context;
public void ejbCreate() {
}
public void setSessionContext(SessionContext context) throws EJBException {
_context = context;
}
public void ejbRemove() throws EJBException {
}
public void ejbActivate() throws EJBException {
}
public void ejbPassivate() throws EJBException {
}
private Object getEntityByDTO(Object entityDTO) throws FinderException,
NamingException {
return null;
}
public String sayHello(){
return "Hello";
}
}
ejb-jar.xml
<?xml version = '1.0' encoding = 'windows-1252'?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee">
<enterprise-beans>
<session>
<description>Session Bean ( Stateless )</description>
<display-name>HelloWorldEJB</display-name>
<ejb-name>HelloWorldEJB</ejb-name>
<home>model.HelloWorldEJBHome</home>
<remote>model.HelloWorldEJB</remote>
<ejb-class>model.HelloWorldEJBBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>HelloWorldEJB</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
客户端查找程序
DataSource dataSource = null;
try {
String ejburl = "t3://localhost:7101/";
/**Setup the environment*/
Hashtable environment = new Hashtable(6);
/**Turn JNDI on to Weblogic and use oracle db password verification*/
environment.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
environment.put(Context.SECURITY_PRINCIPAL, "weblogic");
environment.put(Context.SECURITY_CREDENTIALS, "weblogic1");
environment.put(Context.PROVIDER_URL, ejburl);
Context context = new InitialContext(environment);
method -1 Object obj = context .lookup("HelloWorld10g");
method -2 Object obj2 = context .lookup("HelloWorld10gModelEJB_jarHelloWorldEJB_EO");
System.out.println("JNDI Done");
method -3 context.lookup("HelloWorldEJB#model.HelloWorldEJB");
} catch (Exception ex) {
ex.printStackTrace();
}
现在我的问题是,当客户端程序使用方法 1 和方法 2 查找 ejb bean 时,它返回的 bean 但程序无法通过方法 3 查找 bean。这种方法有什么问题。有人能帮我吗? 请看下图,它会告诉你更多关于 env 的信息。
【问题讨论】:
-
不确定,但默认的weblogic端口是7001(不是
t3://localhost:7101/)。 -
我已将其更改为 7101。其次,此方法 1 和 2 工作正常。唯一的方法是抛出 NamingNotFoundException。