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