我能否从另一个 EJB 中查找 EJB



我有一个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命名空间。

最新更新