从Jboss 4迁移到Jboss 6时,Java EJB2 JNDI查找失败

时间:2017-09-15 19:15:11

标签: java java-ee jboss jndi

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

当转移到JBOSS AS 6.1.Final时,它突然破坏了NameNotFoundException异常。

JNDI View确实显示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>

2 个答案:

答案 0 :(得分:0)

在上下文中获取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;
}

答案 1 :(得分:0)

看起来较新的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">

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

您可以在javaee14-ejb-demo

上找到GitHub上的工作示例