Java 从 Jboss 4 迁移到 Jboss 6 时,EJB 2 JNDI 查找失败
Java EJB2 JNDI Look Up Fail when migrating from Jboss 4 to Jboss 6
我在 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")
在手表 window 上显示 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(在本例中使用 class 名称):
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;
}
看起来较新的 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
找到一个工作示例
我在 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")
在手表 window 上显示 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(在本例中使用 class 名称):
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;
}
看起来较新的 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
找到一个工作示例