我正在使用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语法不正确?
编辑:注意我的项目组织:
感谢阅读。
答案 0 :(得分:1)
EAR / EJB显然已部署。因此,启动Glassfish管理控制台,例如https://<host>:4848
和登录。在左侧,浏览Applications
并单击您的应用程序以显示“编辑应用程序”屏幕。检查应用程序的名称和&amp;显示组件名称 - 并与您的期望值进行比较。
我目前没有部署任何远程EJB,所以我无法确认 - 但我认为对于远程EJB,Action
列下可能会有一个链接来显示URL。
使用名称AltServer
作为EJB的名称:name="EJB(name = "AltServer" ...)
。使用“简单名称”,可以在各种JNDI名称空间(global / app / module)中找到bean;您的查询ctx.lookup("java:global/AltServerEnt/AltServer-ejb/AltServer")
应该有效。
如果添加前缀java:global
,那么您已直接在JNDI全局命名空间中声明了一个名称;您可以使用相同的名称直接在该命名空间中查找您的bean:java:global/AltServer
。是的,您仍然可以在其他名称空间中访问它 - 请参阅第一段。
你问:“我已经将@EJB注释用于我的会话bean,以指定一个名称,如上面链接的FAQ中所解释的那样,当EJB是EAR的一部分时,我不确定它是否合适。任何人都知道吗?”
没关系,这完全取决于你想要什么。与所有名称空间一样,人们可能会考虑避免过度填充命名空间 - 尤其是全局命名空间。给它一点思考,然后做出决定 - 并准备好在必要时重新思考: - )