Java 从单独web应用程序的POJO类引用EJB本地主目录

Java 从单独web应用程序的POJO类引用EJB本地主目录,java,jndi,ejb-3.0,websphere-7,Java,Jndi,Ejb 3.0,Websphere 7,我正在尝试将应用程序中的2个EJB模块从EJB2.1移植到EJB3.0。我正在使用EclipseKeplerIDE,并使用EJB3.0配置重新生成会话bean。我没有使用ejb-jar.xml,因为在ejb3.0中,它应该是冗余的。相反,我使用注释将bean标记为无状态,并指定本地和本地主接口。我仍然保留本地主界面,因为我希望我的项目的基本结构与EJB2.1中的类似。在迁移过程中,我还消除了EJB的xml绑定 我们正在使用WAS7应用程序服务器进行部署,当EJB成功部署且没有错误时,我在从不同w

我正在尝试将应用程序中的2个EJB模块从EJB2.1移植到EJB3.0。我正在使用EclipseKeplerIDE,并使用EJB3.0配置重新生成会话bean。我没有使用ejb-jar.xml,因为在ejb3.0中,它应该是冗余的。相反,我使用注释将bean标记为无状态,并指定本地和本地主接口。我仍然保留本地主界面,因为我希望我的项目的基本结构与EJB2.1中的类似。在迁移过程中,我还消除了EJB的xml绑定

我们正在使用WAS7应用程序服务器进行部署,当EJB成功部署且没有错误时,我在从不同web应用程序的单独POJO类中查找本地主接口时遇到命名异常。我基本上希望在引用EJB本地Home之后调用本地Home接口的create()方法。在下面添加代码示例:

会话Bean:

@Stateless
@Local(AccessLDAPSessionLocal.class)
@LocalHome(AccessLDAPSessionLocalHome.class)
public class AccessLDAPSessionBean implements AccessLDAPSessionLocal {
//Business Logic
}
本地接口:

public interface AccessLDAPSessionLocal {
//business Interface
}
public interface AccessLDAPSessionLocalHome extends EJBLocalHome {

public AccessLDAPSessionLocal create() throws CreateException;

}
本地家庭接口:

public interface AccessLDAPSessionLocal {
//business Interface
}
public interface AccessLDAPSessionLocalHome extends EJBLocalHome {

public AccessLDAPSessionLocal create() throws CreateException;

}
引用本地主接口的Pojo类:

public static AccessLDAPSessionLocal getAccessLDAPSessionBean() throws NamingException, CreateException {
    if (accessLDAPSessionBean == null) {
    InitialContext context = new InitialContext();
    Object obj = context.lookup("java:global/AccessLDAP/AccessLDAPSessionBean!com.ibm.asset.hrportal.core.ejb.ldap.AccessLDAPSessionLocalHome");
        accessLDAPSessionBean = ((AccessLDAPSessionLocalHome) obj).create();
    }
    return accessLDAPSessionBean;
}
此外,我的本地和本地主接口位于我的EJB客户机(用作jar文件)内,而我的会话Bean位于实际的EJB(用作EAR)内

以下是我得到的错误:

NamingException::javax.naming.NameNotFoundException: Name global not found in context "java:".

我是否缺少一些配置导致JNDI查找失败?任何帮助都将不胜感激。提前感谢。

我认为您查找ejb的方式不正确。JNDI名称类似于“java:comp/env/”。ejb引用名称将是web.xml的一部分


此外,在执行查找之前,您需要为上下文对象提供providerURL和factoryName。

我认为您查找ejb的方式不正确。JNDI名称类似于“java:comp/env/”。ejb引用名称将是web.xml的一部分


此外,在执行查找之前,您需要为上下文对象提供providerURL和factoryName。

WebSphereApplicationServer7.0只是EJB3.0的一个实现,但是直到EJB3.1才添加
java:global
命名空间,直到8.0才在WebSphereApplicationServer中实现。与所有EJB3.0实现一样,您需要查找特定于供应商的绑定名称。通过查看SystemOut.log中的
CNTR0167I
消息,可以找到WebSphere Application Server绑定名称。如果要自定义此绑定名称,请参阅知识中心中的主题

无论如何,通过EJB的绑定名直接查找EJB并不是最佳做法。相反,您应该使用EJB引用。在EJB3.0中,这意味着在EE管理的对象(例如servlet或另一个EJB)中使用这样的注释:

在这种情况下,需要EJB容器在包含EJB引用的同一应用程序中查找目标EJB,因此不需要为EJB引用显式配置目标绑定名称

如果需要从实用程序类而不是EE托管类访问EJB引用,则在托管类(如servlet或其他EJB)上使用名称声明EJB引用,并从实用程序类中查找:

@EJB(name = "ejb/accessHome", beanInterface = AccessLDAPSessionLocalHome.class)
public class MyServlet { ... }

public class MyUtility {
    ...
    InitialContext context = new InitialContext();
    Object obj = context.lookup("java:comp/env/ejb/accessHome");
    ...
}
您可以使用
@EJBs
注释在同一托管EE类上配置多个这样的EJB引用:

@EJBs({
    @EJB(name = "ejb/accessHome", beanInterface = AccessLDAPSessionLocalHome.class),
    @EJB(name = "ejb/other" beanInterface = Other.class)
})
public class MyServlet { ... }

如果您的EJB打包在一个单独的EAR中,那么请注意这不是一个可移植的配置。请参阅知识中心主题的“本地客户端视图”部分。此外,您还需要为EJB引用显式地配置绑定名称。

WebSphereApplicationServer7.0只是EJB3.0的一个实现,但是直到EJB3.1才添加
java:global
命名空间,直到8.0才在WebSphereApplicationServer中实现。与所有EJB3.0实现一样,您需要查找特定于供应商的绑定名称。通过查看SystemOut.log中的
CNTR0167I
消息,可以找到WebSphere Application Server绑定名称。如果要自定义此绑定名称,请参阅知识中心中的主题

无论如何,通过EJB的绑定名直接查找EJB并不是最佳做法。相反,您应该使用EJB引用。在EJB3.0中,这意味着在EE管理的对象(例如servlet或另一个EJB)中使用这样的注释:

在这种情况下,需要EJB容器在包含EJB引用的同一应用程序中查找目标EJB,因此不需要为EJB引用显式配置目标绑定名称

如果需要从实用程序类而不是EE托管类访问EJB引用,则在托管类(如servlet或其他EJB)上使用名称声明EJB引用,并从实用程序类中查找:

@EJB(name = "ejb/accessHome", beanInterface = AccessLDAPSessionLocalHome.class)
public class MyServlet { ... }

public class MyUtility {
    ...
    InitialContext context = new InitialContext();
    Object obj = context.lookup("java:comp/env/ejb/accessHome");
    ...
}
您可以使用
@EJBs
注释在同一托管EE类上配置多个这样的EJB引用:

@EJBs({
    @EJB(name = "ejb/accessHome", beanInterface = AccessLDAPSessionLocalHome.class),
    @EJB(name = "ejb/other" beanInterface = Other.class)
})
public class MyServlet { ... }

如果您的EJB打包在一个单独的EAR中,那么请注意这不是一个可移植的配置。请参阅知识中心主题的“本地客户端视图”部分。此外,您需要为EJB引用显式配置绑定名称。

此外,在执行查找之前,您还需要为上下文对象提供providerURL和factoryName。我不知道怎么做。你能帮我吗?context=newinitialcontext();providerURL=“corbaloc::localhost:2809”;factoryName=“com.ibm.websphere.naming.WsnInitialContextFactory”;哈希表=新哈希表(2);表.put(Context.INITIAL\u Context\u FACTORY,factoryName);table.put(Context.PROVIDER\uURL、providerURL);上下文=新的初始上下文(表);我在web.xml中使用了以下代码:ejb/AccessLDAPSession会话com.ibm.asset.hrportal.core.ejb.ldap.AccessLDAPSessionLoca