我有一个EJB,它有一个查找另一个EJB的方法。我有一个带有此代码的NameNotFoundException。
ServiceEJBImpl :
@Stateless(name = "ServiceEJB", mappedName = "AppAcaAvaliacaoAtuarial-ModelAvaliacaoAtuarial-ServiceEJB")
public class ServiceEJBImpl implements ServiceEJB, ServiceEJBLocal{
public void persistConflicts(List<Conflict> conflicts)
{
ConflictDAOLocal conflictDAO = (ConflictDAOLocal) BeanLocator.lookup("java:comp/env/ejb/local/ConflictDAO");
conflictDAO.persistAll(conflicts);
}
冲突道
:@Local
public interface ConflitoDAOLocal{
void persistAll(List<Conflict> conflicts);
}
这是我的查找方法:
public static Object lookup(String jndiName) {
Context context = null;
try {
context = new InitialContext();
return context.lookup(jndiName);
} catch (NamingException ex) {
throw new IllegalStateException("...",ex);
} finally {
try {
context.close();
} catch (NamingException ex) {
throw new IllegalStateException("...",ex);
}
}
}
网站.xml:
<ejb-local-ref>
<ejb-ref-name>ejb/local/ConflictDAO</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>br.gov.rj.rioprev.sigap.acompatuarial.avalatuarial.model.dao.ConflictDAOLocal</local>
<ejb-link>ConflictDAO</ejb-link>
</ejb-local-ref>
<ejb-local-ref>
<ejb-ref-name>ejb/local/ServiceEJB</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>br.gov.rj.rioprev.sigap.acompatuarial.avalatuarial.model.dao.ServiceEJBLocal</local>
<ejb-link>ServiceEJB</ejb-link>
</ejb-local-ref>
在另一个已实例化上下文的 EJB 中查找 EJB 时,实例化新上下文时是否存在问题?
我不是在考虑@EJB注释。
只要您使用正确的 jndi 名称进行查找,您应该能够做到这一点,我不是专家,但如果您在 Web 服务器中运行它,它会告诉您部署之母的 jndi,您也不需要创建自己的查找,有一个已经完成您可以使用它(实际上您正在使用它,但这只是风格问题(, 最好的方法可能是为您的初始上下文提供 Web 服务器的上下文,这取决于我生活在每个 Web 服务器中,它应该像这样做
try{
Properties prop = new Properties();
prop.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); //This is the one that you have to change depending on your webserver
Context context = new InitialContext(prop);
ejbean = (BitacoraBeanRemote)context.lookup("ejb:/EjbSite//BitacoraBean!some.package.bean.BitacoraBeanRemote"); // This is the lookup, it could be a local or a remote interface depending on needs
}catch(Exception e){
e.printStackTrace();
}
当你编辑你的帖子时,我正在写,只要确保你的jndi名称很好"java:comp/env/ejb/local/ConflictDAO",你可能应该改变它,你的应用程序没有找到这个特定的jndi
EJB 中对依赖 EJB 执行 JNDI 查找,您需要在 EJB jar 的ejb-jar.xml
文件中指定ejb-local-ref
元素:
<ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd"
version="3.2">
<enterprise-beans>
...
<session>
<ejb-name>ServiceEJB</ejb-name>
<ejb-local-ref>
<ejb-ref-name>ejb/local/ConflictDAO</ejb-ref-name>
<local>br.gov.rj.rioprev.sigap.acompatuarial.avalatuarial.model.dao.ConflictDAOLocal</local>
<ejb-link>ConflitoDAO</ejb-link>
</ejb-local-ref>
</session>
...
</enterprise-beans>
</ejb-jar>
您必须为每个查找另一个 EJB 的 EJB 提供一个 ejb-local-ref
元素。
EJB jar 中的每个 EJB 都有自己的 java:comp/env
命名空间,而 webapp WAR 文件只有一个java:comp/env
命名空间。