Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找EJB组件的正确方法是什么?_Java_Eclipse_Glassfish 3_Ejb 3.1 - Fatal编程技术网

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

Java 查找EJB组件的正确方法是什么?,java,eclipse,glassfish-3,ejb-3.1,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="myCa

到目前为止,我已经尝试运行我的第一个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();
使用的罐子:gf-client.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/State;Z)V

2其他问题:

  • context.lookup(“java:global:/componentAddress”)
    vs
    context.loopup(“mappedName”)
    它们之间的区别是什么,何时使用它们

  • props.setProperty(“org.omg.CORBA.ORBInitialHost”,“192.168.1.100”)
    vs。
    props.setProperty(“org.omg.CORBA.ORBInitialHost”、“localhost”)


  • 问题简单地归结到glassfish 3.0版,下载了最新的3.1.2版,一切都非常出色。

    我现在回顾并回答您的问题:

    • 使用
      mappedName
      是特定于产品的,这意味着它不保证工作,容器也没有义务实现它,但与之相反,
      name
      是必须的
    • 您可能希望这样注释它:
      @Stateless(name=“myCalculator”,description=“此EJB执行一些复杂的计算。”)
      然后您可以在代码中使用
      Context.lookup()
      Context Context=new InitialContext();mycalculatorremotebean=(MyCalculatorRemote)context.lookup(“java:global/mycalculatorejb/mycalculator!example.domain.calculator.MyCalculatorRemote”)
    • 本例假设您的项目按照推荐的命名约定命名为“mycalculator ejb”,还向您展示了有关此的更多详细信息
    • 当然,您必须在这里添加一些代码以使其实际工作
    回答1):
    java:global/projectejb/someBean!例如.domain.project.SomeRemote
    是可移植的,而映射的名称不是,这意味着第一个可以在任何容器上工作,第二个可能不能。看看官方文件

    回答2):第一个是使用IP为您保存DNS查找,第二个是使用主机名,这是这里的默认值(
    localhost


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

    关于这个问题有很多讨论。您应该可以从@SamiKorhonen中找到答案:@SamiKorhonen恐怕仍然可以获得java.lang.nosuchMethodError,并且您正在按照指示使用appserv-rt.jar?您有什么特别的原因来戳CORBA吗?作为一项技术,它是。。。非常非常传统。另外,让appserver使用
    @EJB
    注释注入bean可能更容易。最后,但并非最不重要的一点是,我有一种烦人的预感,那就是家庭/远程接口的废话也不再需要了。不要在现有问题上移动门柱。如果你原来的问题,如被要求,得到满意的答复,答案应该被接受,关于不同问题的进一步问题应该是单独的帖子。请考虑我的答案,特别是<代码> MaPdDeNeN/COD>,这是供应商特定的,而<代码> @ EJB(查找=“java:global/mycalculator ejb/someBean!example.domain.project.SomeCalculatorRemote”)
    是可移植的,意味着保证运行所有容器。如果以后出于任何原因想切换到其他容器
    mappedName
    可能无法工作(不保证实现)。并且永远不要说永不!;-)