到目前为止,我一直试图运行我的第一个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个问题:
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")
答案 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");
答案1):java:global/project-ejb/someBean!example.domain.project.SomeRemote
是可携带的,而映射的名称不是,意味着第一个适用于任何容器而第二个可能不适用。在官方文档中查看here。
回答2):首先是IP保存DNS查找,第二个是主机名,这是默认值(localhost
)。
我希望这可以回答你一些问题,即使是4年之后。