我可以从另一个EJB查找EJB吗?

时间:2017-03-29 20:57:42

标签: java 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);
}

ConflictDAOLocal:

@Local
public interface ConflitoDAOLocal{
   void persistAll(List<Conflict> conflicts);
}

这是我的lookupMethod:

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);
        }
    }
}

的web.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注释。

2 个答案:

答案 0 :(得分:0)

如果您使用正确的jndi名称查找,您应该能够这样做,我不是专家,但如果您在Web服务器中运行它,它会告诉您部署时的jndi,也不要真的需要创建自己的查找,有一个已经完成,你可以使用它(实际上你正在使用它,但这只是一个风格的问题),最好的方法可能是给你的初始上下文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

答案 1 :(得分:0)

为了在EJB中为依赖EJB执行JNDI查找,您需要在EJB jar中的ejb-local-ref文件中指定ejb-jar.xml元素:

<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命名空间。