【问题标题】:What is the right way to look up EJB component?查找 EJB 组件的正确方法是什么?
【发布时间】:2013-05-13 19:36:05
【问题描述】:

到目前为止,几天来一直在尝试运行我的第一个 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,不需要像 Glassfish 社区推荐的那样添加其他 JAR

异常捕获:

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/State;Z)V

2 个其他问题:

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

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

【问题讨论】:

  • 关于这个主题的讨论很多。您应该可以从以下位置找到答案:valery-lavrov.com/blog/2012/05/15/…
  • @SamiKorhonen 恐怕还是会得到 java.lang.NoSuchMethodError
  • 你正在按照指示使用 appserv-rt.jar 吗?
  • 您对 CORBA 有什么特别的原因吗?作为一项技术,它......非常非常传统。此外,让应用服务器使用 @EJB 注释注入您的 bean 可能更容易。最后但并非最不重要的一点是,我有一种挥之不去的预感,即不再需要家庭/远程界面废话。
  • 回复:您的“另外两个问题”位:永远不要这样做。不要在现有问题上移动球门柱。如果您最初提出的问题得到了满意的回答,则应接受答案,有关不同问题的其他问题应单独发布。

标签: java eclipse glassfish-3 ejb-3.1


【解决方案1】:

问题归结为 glassfish 3.0 版,下载了最新的 3.1.2 版,一切正常。

【讨论】:

  • 请考虑我的回答,尤其是mappedName,它是特定于供应商的,而@EJB(lookup="java:global/mycalculator-ejb/someBean!example.domain.project.SomeCalculatorRemote") 是可移植的,保证可以运行所有容器。如果您以后出于任何原因想要切换到其他容器 mappedName 可能工作(不保证会实施)。永远不要说永远! ;-)
【解决方案2】:

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

  • 使用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 是可移植的,而映射的名称不是,这意味着 1st 适用于任何容器,而 2nd 可能不适用。在官方文档中查看here

回答 2):首先是使用 IP 为您节省 DNS 查找,第二个是使用主机名,这里是默认值 (localhost)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2021-08-08
    • 2012-04-05
    • 1970-01-01
    • 2019-12-29
    相关资源
    最近更新 更多