Java 查找EJB组件的正确方法是什么?
到目前为止,我已经尝试运行我的第一个EJB项目了几天。我的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
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”)
vscontext.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”,还向您展示了有关此的更多详细信息
- 当然,您必须在这里添加一些代码以使其实际工作
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
可能无法工作(不保证实现)。并且永远不要说永不!;-)