【问题标题】:Java EJB2 JNDI Look Up Fail when migrating from Jboss 4 to Jboss 6从 Jboss 4 迁移到 Jboss 6 时 Java EJB2 JNDI 查找失败
【发布时间】:2018-02-25 00:51:45
【问题描述】:

我有一个在 JBOSS 4.2.3GA 上运行的 EJB2 应用程序,并且查找工作正常,使用:java:comp/env/ejb/MyEJB

在迁移到 JBOSS AS 6.1.Final 时,突然出现异常 NameNotFoundException。

JNDI 视图确实显示 EJB 绑定到正确的树。在查找之前放置一个断点,我能够观察并确认它已绑定。使用context.list("java:comp/env/ejb"),我能够在迭代器中看到MyEJB。使用context.lookup("java:comp/env/ejb") 也可以。但是 context.lookup("java:comp/env/ejb/MyEJB") 在监视窗口上显示 NamingException(运行实际代码时显示 NameNotFoundException)。

有什么我不知道的变化吗?很难找到有关此 EJB 内容的信息,并且我发现的任何信息表明要么确认我做对了,要么说使用 ejb/MyEJB,这根本不起作用。

提前致谢。感谢您的帮助。

ejb-jar.xml:

<session>
        <ejb-name>AdminSessionEJB</ejb-name>
        <local-home>com.admin.ejb.business.AdminSessionHome</local-home>
        <local>com.admin.ejb.business.AdminSession</local>
        <ejb-class>com.admin.ejb.business.AdminSessionEJB</ejb-class>
        <session-type>Stateless</session-type>
        <transaction-type>Container</transaction-type>
        <ejb-local-ref>
            <ejb-ref-name>ejb/UserEJB</ejb-ref-name>
            <ejb-ref-type>Entity</ejb-ref-type>
            <local-home>com.admin.ejb.entity.UserHome</local-home>
            <local>com.admin.ejb.entity.User</local>
            <ejb-link>UserEJB</ejb-link>
        </ejb-local-ref>
        <ejb-local-ref>
            <ejb-ref-name>ejb/UniqueKeyEJB</ejb-ref-name>
            <ejb-ref-type>Entity</ejb-ref-type>
            <local-home>com.framework.ejb.entity.UniqueKeyHome</local-home>
            <local>com.framework.ejb.entity.UniqueKey</local>
            <ejb-link>UniqueKeyEJB</ejb-link>               
        </ejb-local-ref>
        <ejb-local-ref>
            <ejb-ref-name>ejb/UserGroupEJB</ejb-ref-name>
            <ejb-ref-type>Entity</ejb-ref-type>
            <local-home>com.admin.ejb.entity.UserGroupHome</local-home>
            <local>com.admin.ejb.entity.UserGroup</local>
            <ejb-link>UserGroupEJB</ejb-link>
        </ejb-local-ref>
</session>

jboss.xml:

<enterprise-beans>
        <entity>

        <ejb-name>UserEJB</ejb-name>
        <local-jndi-name>ejb/UserHome</local-jndi-name>
        <read-only>false</read-only>
        <configuration-name>UserEJB Container Configuration</configuration-name>            
        <ejb-local-ref>
            <ejb-ref-name>ejb/UserGroupEJB</ejb-ref-name>
            <local-jndi-name>ejb/UserGroupHome</local-jndi-name>
        </ejb-local-ref>
    </entity>
</enterprise-beans>

【问题讨论】:

  • 请显示 ejb-jar.xml 文件中 EJB 声明的 XML 声明和 jboss.xml 文件中相应的 XML。
  • 我已经发布了仅用于 UserEJB 的部分,这就是我正在测试的内容。如果您需要更多,请告诉我。谢谢。
  • 我认为您需要从 jboss.xml 文件中删除 &lt;local-jndi-name&gt;ejb/UserHome&lt;/local-jndi-name&gt;,因为容器应该从 ejb-jar.xml 文件中的 &lt;ejb-link&gt;UserEJB&lt;/ejb-link&gt; 条目中找出链接。此外,将&lt;ejb-local-ref&gt;...&lt;/ejb-local-ref&gt; 放在 jboss.xml 文件中也没有意义(除非您试图覆盖 ejb-jar.xml 文件的内容)。
  • 删除上面提到的 1 个或两个后出现同样的错误。看日志,去掉&lt;local-jndi-name&gt;后,JBOSS自动给它起了一个新名字Bound EJB LocalHome 'UserEJB' to jndi 'local/UserEJB@1161245188'。这是删除之前的样子:Bound EJB LocalHome 'UserEJB' to jndi 'ejb/UserHome'
  • 好吧,我继续删除了 jboss.xml 中的所有内容,以便所有 EJB 都由名称为 NameEJB@xxxxxxxxxx 的 JBOSS 生成,然后在首次访问时使用 key = NameEJB 和 @987654337 存储所有这些名称@ 然后根据值查找。非常感谢您花时间研究我的问题。非常感谢你,史蒂夫。

标签: java jakarta-ee jboss jndi


【解决方案1】:

看起来较新的 JBoss/WildFly 版本不能很好地处理旧的部署描述符。

如果您从以下位置更新 ejb-jar.xml 架构:

    <ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
      http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
      version="2.1">

至少:

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

那么它应该像宣传的那样工作。

您可以在 GitHub 上的 javaee14-ejb-demo 上找到一个工作示例

【讨论】:

  • 抱歉,您花了这么多时间来测试所有这些场景。我尝试了它们,但在从 2_0.dtd 切换到 3_0.xsd 后遇到了很多问题,并且修复了 1 导致了另一个问题,所以我现在必须使用以前的解决方案。最终目标是wildfly 10.0,我敢肯定我会再次遇到这个问题。那时我会玩它。再一次,我真的很感谢你的时间,史蒂夫。
【解决方案2】:

在上下文中获取 EJB(在本例中使用类名):

public static <T> T getInstance(final Class<T> type) {
    T result = null;
    try {
        InitialContext ctx = new InitialContext();
        BeanManager manager = (BeanManager) ctx.lookup("java:comp/BeanManager");
        Set<Bean<?>> beans = manager.getBeans(type);
        Bean<T> bean = (Bean<T>) manager.resolve(beans);
        if (bean != null) {
            CreationalContext<T> context = manager.createCreationalContext(bean);
            if (context != null) {
                result = (T) manager.getReference(bean, type, context);
            }
        }
    } catch (NamingException e) {
        throw new RuntimeException(e);
    }
    return result;
}

【讨论】:

  • 我添加了 cdi-api-1.2.jar 并尝试使用您的 sn-p 但 ctx.lookup("java:comp/BeanManager") returns null。我需要在 xml 中为 BeanManager 设置配置吗?如果这个 BeanManager 能够以某种方式获取 EJB,它一定在后台进行相同的查找,对吗?那么在那种情况下,不就是我的查找字符串不正确吗?
猜你喜欢
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多