查找EJB组件的正确方法是什么?

时间:2013-05-13 19:36:06

标签: java eclipse glassfish-3 ejb-3.1

到目前为止,我一直试图运行我的第一个EJB项目几天。我的EJB项目目前有这个源代码:

package calc;
import javax.ejb.Remote;
@Remote
public interface SessionBeanRemote {
public int add(int a,int b);
}

package calc;
import javax.ejb.Stateless;
@Stateless(name="MySessionBean",mappedName="myCalculator")
public class SessionBean implements SessionBeanRemote {
public int add(int a,int b){
   return a +b;
}
}

其次,有另一个简单的java项目,我可以在其中调用EJB组件:

Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming.
SerialInitContextFactory");
props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext ctx = new InitialContext(props);
SessionBeanRemote bean =   (SessionBeanRemote) ctx.lookup("myCalculator");
int result = bean.add(3, 4);
System.out.println(result);
ctx.close();

JAR使用:gf-client.jar,无需添加其他JAR作为Glassfish社区表示赞赏

发现异常:

  

java.lang.NoSuchMethodError:com.sun.corba.ee.spi.orbutil.fsm.FSMImpl。(Lcom / sun / corba / ee / spi / orbutil / fsm / StateEngine; Lcom / sun / corba / ee / SPI / orbutil / FSM /州; Z)V

另外2个问题:

  1. context.lookup("java:global:/componentAddress") vs context.loopup("mappedName") 他们之间有什么区别,什么时候使用?

  2. props.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.100") vs.    props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost")

2 个答案:

答案 0 :(得分:0)

简单问题归结为glassfish版本3.0,下载最新版本3.1.2,一切都很棒。

答案 1 :(得分:0)

我正在审核并回答你的问题:

  • 使用mappedName是特定于产品的,意味着无法保证工作,并且容器没有义务实施它,但相比之下name是必须的。
  • 您可能希望以这种方式对其进行注释:@Stateless(name="myCalculator", description="This EJB does some complex calculations.")然后您可以在代码中使用Context.lookup()Context context = new InitialContext(); MyCalculatorRemote bean = (MyCalculatorRemote) context.lookup("java:global/mycalculator-ejb/myCalculator!example.domain.calculator.MyCalculatorRemote");
  • 此示例假定您的项目按照建议的命名约定命名为“mycalculator-ejb”,this link还会向您显示有关此内容的更多详细信息。
  • 确定你必须在这里添加一些代码才能让它真正起作用

答案1):java:global/project-ejb/someBean!example.domain.project.SomeRemote是可携带的,而映射的名称不是,意味着第一个适用于任何容器而第二个可能不适用。在官方文档中查看here

回答2):首先是IP保存DNS查找,第二个是主机名,这是默认值(localhost)。

我希望这可以回答你一些问题,即使是4年之后。