如何访问 EJB?

Posted

技术标签:

【中文标题】如何访问 EJB?【英文标题】:How to access an EJB? 【发布时间】:2011-04-29 00:05:01 【问题描述】:

我正在尝试在 Eclipse 中的 JBOSS 4.2 上开发基本 EJB3 应用程序

我在 eclipse 中创建了一个 EJB 项目。

以下是我的远程和本地接口。

package com.test;
import javax.ejb.Local;

@Local
public interface HelloWorldLocal 

  public String getGreeting();


package com.test;
import javax.ejb.Remote;

@Remote
public interface HelloWorldRemote 

   public String getGreeting();

我的 ejb 实现是

package com.test;
import javax.ejb.Stateless;

@Stateless
 public class HelloWorld implements HelloWorldRemote, HelloWorldLocal 


public HelloWorld() 
    // TODO Auto-generated constructor stub


public String getGreeting() 
    // TODO Auto-generated method stub
    return "First EJB People";



我已经将它部署为 JBoss 中的爆炸 JAR,它运行良好。

我的第一个问题是:

我还有什么要添加到这个爆炸的罐子里?

其次,我创建了一个独立的客户端并将上面的 jar 添加到它的类路径中

客户端代码如下

包 com.testejb;

导入 java.io.FileInputStream; 导入 java.util.Properties;

导入 javax.naming.InitialContext;

public class TestBean 

/**
 * @param args
 */
public static void main(String[] args) 

    // TODO Auto-generated method stub
      HelloWorldRemote getMess = null;
      try 
          Properties props = new Properties();
            Properties props = new Properties();
             props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
            props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
            props.setProperty("java.naming.provider.url", "localhost:1099"); 

          InitialContext ic = new InitialContext(props);

          //


          getMess = (HelloWorldRemote) ic.lookup("HelloWorldRemote/remote");
          System.out.println(getMess.getGreeting());
     catch (Exception e) 
    
        // TODO: handle exception
        e.printStackTrace();
    


jar 的名称是 FirstEJB。 我已尝试查找为 FirstEJB/HelloWorldRemote/remote。

但是当我运行程序时,我得到了错误

javax.naming.NameNotFoundException: HelloWorldRemote not bound

如果我将查找键入为 HelloWorld/remote,我会收到错误

Caused by: java.io.InvalidClassException: org.jboss.ejb3.remoting.BaseRemoteProxy; local class incompatible: stream classdesc serialVersionUID = 1126421850898582900, local class serialVersionUID = -2711693270411201590

【问题讨论】:

【参考方案1】:

我还有什么要添加到这个爆炸的罐子里?

没什么,可以用的。

我已尝试查找为 FirstEJB/HelloWorldRemote/remote

对于 JBoss,JNDI 名称将是:

<myEarName>/<EJB-Name>/remote

如果未指定,则 EJB 名称默认为 Bean 名称。因此,在您的情况下,不使用 EAR 包装,JNDI 名称应该是:

HelloWorld/remote

顺便说一下,这应该在部署时记录在服务器日志中。

如果我将查找键入为 HelloWorld/remote,则会收到错误 (...)

用于查找的 JNDI 名称是正确的,这个错误是另一个与EJBTHREE-1118 非常相似的问题。可以试试 JBoss 4.2.3.GA 吗?

【讨论】:

以上是关于如何访问 EJB?的主要内容,如果未能解决你的问题,请参考以下文章

无法从其他主机进行远程 ejb 访问

在 Singleton 的 PreDestroy 方法中访问无状态 EJB

从另一个客户端访问部署在 JBoss 7.0.1 中的 ejb

我无法设置我的 jndi.properties 来访问 Jboss 5 上的远程 EJB

远程客户端访问部署在 JBOSS AS 中的 EJB 的 JNDI 循环(7.1.1 最终版)

配置安全性以通过 WS 访问 EJB -- WFLYEJB0364 连接被拒绝