我已经成功配置了两个Java EE 6应用程序,通过遵循this documentation中的简单注释,通过RMI-IIOP相互通信。一个应用程序在另一个应用程序中调用远程EJB来获取当前时间,反之亦然。
一切似乎都在起作用,但我对glassfish-ejb-jar.xml
的一个要素感到困惑。给我一点时间解释一下。我有两个应用程序,Alpha和Beta。以下是Beta的部署描述符:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd">
<glassfish-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>BetaLocalSessionBean</ejb-name>
<ejb-ref>
<ejb-ref-name>ejb/alphaSessionBean</ejb-ref-name>
<jndi-name>corbaname:iiop:alphaServerUrl:11637#java:global/AlphaApplication/AlphaApplication-ejb/AlphaSessionBean</jndi-name>
</ejb-ref>
</ejb>
</enterprise-beans>
</glassfish-ejb-jar>
BetaLocalSessionBean
是一个本地无状态会话Bean,我注入远程AlphaSessionBean
来获取时间。我的困惑是:如果我删除 <ejb-name>
元素,为什么会出现以下异常?
Warning: DPL8007: Unsupported deployment descriptors element jndi-name value corbaname:iiop:alpha:3700#java:global/AlphaApplication/AlphaApplication-ejb/AlphaSessionBean
Severe: Exception while deploying the app [BetaApplication]
Severe: java.lang.NullPointerException
at com.sun.enterprise.deployment.node.runtime.EjbNode.endElement(EjbNode.java:202)
at com.sun.enterprise.deployment.node.SaxParserHandler.endElement(SaxParserHandler.java:481)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)
...
Severe: Exception while deploying the app [BetaApplication]
为什么<ejb-name>
元素是强制性的?我在上面链接的文档中没有提到它。我放在哪个bean名称有关系吗?我已经确认我可以将AlphaSessionBean
注入到除BetaLocalSessionBean
以外的其他bean中,那么这个元素的意义是什么?
版本:
文档:
答案 0 :(得分:0)
我认为你得到的错误是合乎逻辑的,因为这是应用服务器知道在哪里注入ref的唯一方法,即alphasessionbean。
该名称也必须是您创建的EJB bean的名称,除非您在@Stateless或@Stateful注释上配置了name属性,在这种情况下ref将是该名称。