在OECP(Open Enterprise Components Plateform,开放的企业级组件平台)项目的架构体系中,我们知道在客户端需要通过JNDI来调用EJB容器中的SessionBean,那么如何在EJB3中JNDI调用SessionBean呢?
在EJB3中,获得JNDI上下文主要有两种方式。(默认采用jboss的获取方式)
1、 通过程序编码的方式
Java代码
- public static InitialContext getInitialContext() throws NamingException{
- Properties p = new Properties();
- p.put(Context.INITIAL_CONTEXT_FACTORY,
- "org.jnp.interfaces.NamingContextFactory");
- p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
- p.put(Context.PROVIDER_URL, "jnp://localhost:1099");
- return new InitialContext(p);
- }
客户端通过InitialContext ctx = getInitialContext();的方式来获取上下文。
2、 通过配置属性文件的方式
在应用的src下新建一个jndi.properties的资源文件(注意文件名必须是jndi.properties)
内容:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
客户端只要通过下面的方法就能获得上下文对象了
InitialContext ctx = new InitialContext();
为了方便在程序开发的过程中的测试,我们一般情况下会封装一个获得JNDI上下文的工具类来使用。比如我们构建的一个如下的EJBFinder.java的类:
Java代码
- public class EJBFinder {
- public static InitialContext getInitialContext() throws NamingException{
- Properties p = new Properties();
- p.put("server", "jboss");
- p.put(Context.INITIAL_CONTEXT_FACTORY,
- "org.jnp.interfaces.NamingContextFactory");
- p.put(Context.URL_PKG_PREFIXES,
- "org.jboss.naming:org.jpn.interfaces");
- p.put(Context.PROVIDER_URL, "jnp://localhost:1099");
- InitialContext ctx = new InitialContext(p);
- return ctx;
- }
- public static Object findEJB(String ejbname) throws NamingException{
- return getInitialContext().lookup(ejbname);
- }
- }
这样的一个工具类给我们测试EJB组件提供了很大的方便,不用我们再去重复的去构建JNDI上下文的环境。但是当EJB组件开发完成后,正式部署到正式环境中,客户端调用EJB组件怎样去调用呢?
请看下一篇:如何在EJB3中JNDI调用SessionBean(二)