glassfish中的JNDI / Classpath问题

时间:2010-05-06 17:06:55

标签: glassfish ejb-3.0

我正在将一个大型J2EE应用程序(下面称为AeApp)从EJB 2转换为EJB 3(所有无状态会话bean,使用glassfish 2.1.1),并且没有想法。

我转换的第一个EJB(让我们称之为Foo)在没有重大问题的情况下运行(它是ejb模块中唯一的一个,我可以完全用注释替换部署描述符)并且app运行正常。但在转换第二个之后(让我们称之为Bar,一个在不同的ejb模块中的一个),有一个奇怪的问题组合:

  • AeApp无错误地部署(日志中也没有)。在日志中,我得到了Foo和Bar的初始化消息,但是有关方法权限和JNDI名称的更多消息仅针对Foo:

    [#|2010-05-10T12:26:13.234+0200|FINE|sun-appserver2.1|javax.enterprise.system.core.security|_ThreadID=25;_ThreadName=Thread-2821;ClassName=com.sun.enterprise.security.application.EJBSecurityManager;MethodName=initialize;_RequestID=1801c4ff-90fe-4406-aaac-219c669be8c1;|Codebase (module id for ejb Foo) = null|#]
    [#|2010-05-10T12:26:11.625+0200|FINE|sun-appserver2.1|javax.enterprise.system.core.security|_ThreadID=25;_ThreadName=Thread-2821;ClassName=com.sun.enterprise.security.application.EJBSecurityManager;MethodName=initialize;_RequestID=1801c4ff-90fe-4406-aaac-219c669be8c1;|Codebase (module id for ejb Bar) = null|#]
    [#|2010-05-10T12:26:13.234+0200|FINE|sun-appserver2.1|javax.enterprise.system.core.security|_ThreadID=25;_ThreadName=Thread-2821;ClassName=com.sun.enterprise.security.application.EJBSecurityManager;MethodName=fooMethod;_RequestID=1801c4ff-90fe-4406-aaac-219c669be8c1;|JACC DD conversion: EJBMethodPermission ->(Foo fooMethod,Remote,java.lang.Long,java.util.Locale)protected by role -> FOOUSER|#]
    [#|2010-05-10T12:26:19.312+0200|INFO|sun-appserver2.1|javax.enterprise.system.container.ejb|_ThreadID=17;_ThreadName=httpWorkerThread-14848-1;|**RemoteBusinessJndiName: com.example.Foo; remoteBusIntf: com.example.Foo|#]
    
  • 通过JNDI查找Bar时出错

  • 查看glassfish管理控制台中的JNDI树时,Bar根本不存在。
  • 同一模块中的其他EJB确实出现,Foo也是如此。
  • 有关Foo的日志中有例外,但这些例子在它仍在工作时已经出现。

任何可能导致此问题或如何进一步诊断的想法?这些bean非常简单:

@Stateless(name = "Foo")
@RolesAllowed("FOOUSER")
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class FooImpl extends BaseBean implements Foo {

我对Bar的部署描述符也有一些问题:我想消除它,但是glassfish似乎不喜欢只在sun-ejb-jar.xml中出现bean,或者有一些描述符中声明的模块中的bean和其他只使用注释的文件。

编辑:EAR的结构如下:

AeApp.ear
    AeApp.war
    Foo.jar (Foo.class and FooImpl.class present here)
    Bar.jar (Bar.class and BarImpl.class present here, also BaseBean.class)
    (some more EJB module JARs)
    (lots of library JARs)

AeApp.ear没有(和AFAIK从未有过,即使它工作时)也没有META-INF / MANIFEST.MF。它的application.xml如下所示:

<application>
  <description>AE EAR</description>
  <display-name>AE EAR</display-name>
  <module><ejb>Foo.jar</ejb></module>
  <module><ejb>Bar.jar</ejb></module>
  <module><ejb>Baz.jar</ejb></module>
  <module><ejb>Doh.jar</ejb></module>
  <module><web>
      <web-uri>AeApp.war</web-uri>
      <context-root>/</context-root>
  </web></module>
</application>

2 个答案:

答案 0 :(得分:2)

经过一些反复试验后,我缩小了问题范围,一位同事让我走上正轨。问题不在于类路径或EJB本身。这真是太笨了。

我的ejb-jar.xml有一个EJBv2 DOCTYPE。这导致glassfish仅使用注释静默地忽略EJB,并且在部署描述符中声明它们时无法将它们放入JNDI树中。我所要做的就是替换它:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
     <ejb-jar>

有了这个:

<?xml version="1.0" encoding="UTF-8"?>
     <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" 
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                                  http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">

答案 1 :(得分:1)

我没有看到您之前发布的确切错误消息,但是他们看向我,好像条形码的META-INF / MANIFEST.MF Class-Path属性中缺少“foo-ejb.jar”。可以通过使用其他方法将Foo编译到其类路径中来编译条形码,但在运行应用程序时这不起作用。

但我同意Pascal的观点,我们可能真的需要有关您项目结构的更多信息。关于你拥有哪些罐子的简短描述(或者可能是图表),哪个相关类(Foo / Bar / FooImpl / BaseBean / ..)在哪个jar中,它们是如何相关的+它们的注释可能就足够了。 / p>