Glassfish 3 / EJB 3.独立的Java客户端

时间:2012-08-08 14:59:04

标签: glassfish client ejb javabeans

我正在使用Glassfish 3.1.2在netbeans API之上开发一个应用程序。我的netbeans应用程序应该是我必须连接到EJB的独立Java客户端。

我已将EJB打包到EAR(企业应用程序)中。我面临的问题是,当我尝试查找可用的EJB时,我遇到了异常。

这是我的bean会话:

@Stateless
@EJB(name = "java:global/AltServer", beanInterface = AltServerRemote.class)
public class AltServer implements AltServerRemote {

远程接口:

@Remote
public interface AltServerRemote {

最后是查询电话:

props.setProperty("org.omg.CORBA.ORBInitialHost", getGlassfishHostname());
props.setProperty("org.omg.CORBA.ORBInitialPort", getServerPort());
ctx = new InitialContext(props)

ctx.lookup("java:global/AltServerEnt/AltServer-ejb/AltServer")

关于如何查找打包到EAR中的EJB,我已经遵循了这个:http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#CosNaming并使用了jndi语法:

java:global[/<app-name>]/<module-name>/<bean-name>

所以在我的情况下,我的企业应用程序是 AltServerEnt ,我的EJB模块是 AltServer-ejb ,我的会话bean被称为 AltServer (参见上文)。

注意:我已经使用@EJB注释到我的会话bean来指定一个名称,如上面链接的FAQ中所解释的那样,当EJB是EAR的一部分时,我不确定它是否合适。有人知道吗?

这里是我得到的异常,在查找行中提出:

java.lang.ClassNotFoundException: com.sun.ejb.codegen.GenericEJBHome_Generated

有很多“引起”的条款,但这是第一条:

javax.naming.NamingException: Lookup failed for 'java:global/AltServerEnt/AltServer-ejb/AltServer' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost=127.0.0.1, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: ejb ref resolution error for remote business interfaceorg.altanis.remote.AltServerRemote [Root exception is java.lang.RuntimeException: Could not invoke defineClass!]]

所以我猜我的会话bean没找到,但为什么?我的JNDI语法不正确?

编辑:注意我的项目组织:

  • AltServerEnt:企业应用程序 - 包含EJB模块
  • AltServer-ejb:EJB模块 - 包含会话bean,并包含一个包含远程接口(AltServerRemote)的netbeans插件。

感谢阅读。

1 个答案:

答案 0 :(得分:1)

EAR / EJB显然已部署。因此,启动Glassfish管理控制台,例如https://<host>:4848和登录。在左侧,浏览Applications并单击您的应用程序以显示“编辑应用程序”屏幕。检查应用程序的名称和&amp;显示组件名称 - 并与您的期望值进行比较。

我目前没有部署任何远程EJB,所以我无法确认 - 但我认为对于远程EJB,Action列下可能会有一个链接来显示URL。

命名选项

  1. 使用名称AltServer作为EJB的名称:name="EJB(name = "AltServer" ...)。使用“简单名称”,可以在各种JNDI名称空间(global / app / module)中找到bean;您的查询ctx.lookup("java:global/AltServerEnt/AltServer-ejb/AltServer")应该有效。

  2. 如果添加前缀java:global,那么您已直接在JNDI全局命名空间中声明了一个名称;您可以使用相同的名称直接在该命名空间中查找您的bean:java:global/AltServer。是的,您仍然可以在其他名称空间中访问它 - 请参阅第一段。

  3. 同时

    你问:“我已经将@EJB注释用于我的会话bean,以指定一个名称,如上面链接的FAQ中所解释的那样,当EJB是EAR的一部分时,我不确定它是否合适。任何人都知道吗?”

    没关系,这完全取决于你想要什么。与所有名称空间一样,人们可能会考虑避免过度填充命名空间 - 尤其是全局命名空间。给它一点思考,然后做出决定 - 并准备好在必要时重新思考: - )