【问题标题】:How to access EJB using JNDI Weblogic如何使用 JNDI Weblogic 访问 EJB
【发布时间】: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。

标签: java weblogic ejb-2.x


【解决方案1】:

您的 bean 只有一个 Remote Interface,在这种情况下,不需要完全限定的名称。这应该有效:

HelloWorldEJB helloWorldEJB = (HelloWorldEJB) context.lookup("HelloWorldEJB");

如果您有多个Remote Interfaces,则需要查找包含目标EJB 的全局JNDI 名称和特定Remote Interface 部分的名称,用符号# 分隔

【讨论】:

  • 首先我的项目中有n个遥控器,我只是在测试如何访问bean。其次,我尝试了您的解决方案,但给出了错误。 "javax.naming.NameNotFoundException: 无法解析 'HelloWorldEJB'。已解决'' [根异常是 javax.naming.NameNotFoundException: 无法解析 'HelloWorldEJB'。已解决''];剩余名称为 'HelloWorldEJB"
  • 我已经粘贴了所有内容,你能帮我做这个查找字符串吗?这里的全局 JNDI 是什么。像这样 globalJNDI#RemoteInterface
猜你喜欢
  • 2013-01-30
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 2012-02-23
  • 2014-01-14
  • 2013-01-04
  • 2013-04-19
  • 1970-01-01
相关资源
最近更新 更多