Skip to content

Java_Create_JNDI_Binding

Iacob edited this page Dec 20, 2010 · 3 revisions

创建JNDI Binding

开发J2EE程序时候,最让人头疼的莫过於各种各样的JNDI Binding,用得最多的一个类型要算DataSource,某些应用服务器上还有邮件服务、目录服务等等。

J2EE程序使用起来十分简单灵活,把服务器安装好然後把J2EE程序上传上去就可以了,比起PHP程序来要简单得多,但是在开发和测试时就要遇到各类名目繁多的概念和封装。一些非EJB项目,例如用Spring组织的项目,为了提高速度往往需要用一些静态变量,但是这些静态变量在程序装载和卸除时经常会出现一些奇怪的问题。

解决这些问题颇费周折,最好的方法莫过於把业务逻辑拿到应用服务器之外编写和测试,但是应用服务器一般都自带大量强大的JNDI资源,废弃不用的话产品会丢失不少卖点,将其模拟下来是最好的方法。一个项目甚至项目里的每个模块,在开发前期做好测试计划都是很有必要的,但这个话题太大了,这里写不了,我这里只写一些关於自己创建JNDI Binding的内容。

自己创建JNDI Binding需要建一大堆模型,至少需要InitialContextFactoryBuilder、InitialContextFactory和Context这三个,不可谓不复杂,但是其机制并不繁琐,只是想得周全一些罢了,例子代码如下:

   1. package testjndi;
   2.
   3. import java.util.Hashtable;
   4. import javax.naming.Binding;
   5. import javax.naming.Context;
   6. import javax.naming.Name;
   7. import javax.naming.NameClassPair;
   8. import javax.naming.NameParser;
   9. import javax.naming.NamingEnumeration;
  10. import javax.naming.NamingException;
  11. import javax.naming.spi.InitialContextFactory;
  12. import javax.naming.spi.InitialContextFactoryBuilder;
  13. import javax.naming.spi.NamingManager;
  14.
  15. /**
  16.  *
  17.  * @author
  18.  */
  19. public class CustomizedInitialContextFactoryBuilder
  20.             implements InitialContextFactoryBuilder {
  21.
  22.     public static void initialize() {
  23.
  24.         try {
  25.
  26.             // 覆盖原先的设置
  27.             NamingManager.setInitialContextFactoryBuilder(
  28.                 new CustomizedInitialContextFactoryBuilder());
  29.         }catch(Exception e) {
  30.             e.printStackTrace(System.err);
  31.         }
  32.     }
  33.
  34.     public InitialContextFactory createInitialContextFactory
  35.                 (Hashtable<?, ?> environment) throws NamingException {
  36.
  37.         return new MyCustomizedInitialContextFactory();
  38.     }
  39.
  40.     private class MyCustomizedInitialContextFactory
  41.             implements InitialContextFactory {
  42.
  43.         public Context getInitialContext(Hashtable<?, ?> environment)
  44.                 throws NamingException {
  45.
  46.             CustomizedContext customizedContext
  47.                     = new CustomizedContext();
  48.
  49.             return customizedContext;
  50.         }
  51.     }
  52.
  53.     private class CustomizedContext implements Context {
  54.
  55.         public Object addToEnvironment(String propName, Object propVal)
  56.                 throws NamingException {
  57.
  58.             throw new UnsupportedOperationException("Not supported yet.");
  59.         }
  60.
  61.         public void bind(Name name, Object obj) throws NamingException {
  62.             throw new UnsupportedOperationException("Not supported yet.");
  63.         }
  64.
  65.         public void bind(String name, Object obj) throws NamingException {
  66.             throw new UnsupportedOperationException("Not supported yet.");
  67.         }
  68.
  69.         public void close() throws NamingException {
  70.             throw new UnsupportedOperationException("Not supported yet.");
  71.         }
  72.
  73.         public Name composeName(Name name, Name prefix) throws NamingException {
  74.             throw new UnsupportedOperationException("Not supported yet.");
  75.         }
  76.
  77.         public String composeName(String name, String prefix)
  78.                 throws NamingException {
  79.
  80.             throw new UnsupportedOperationException("Not supported yet.");
  81.         }
  82.
  83.         public Context createSubcontext(Name name) throws NamingException {
  84.             throw new UnsupportedOperationException("Not supported yet.");
  85.         }
  86.
  87.         public Context createSubcontext(String name) throws NamingException {
  88.             throw new UnsupportedOperationException("Not supported yet.");
  89.         }
  90.
  91.         public void destroySubcontext(Name name) throws NamingException {
  92.             throw new UnsupportedOperationException("Not supported yet.");
  93.         }
  94.
  95.         public void destroySubcontext(String name) throws NamingException {
  96.             throw new UnsupportedOperationException("Not supported yet.");
  97.         }
  98.
  99.         public Hashtable<?, ?> getEnvironment() throws NamingException {
 100.             throw new UnsupportedOperationException("Not supported yet.");
 101.         }
 102.
 103.         public String getNameInNamespace() throws NamingException {
 104.             throw new UnsupportedOperationException("Not supported yet.");
 105.         }
 106.
 107.         public NameParser getNameParser(Name name) throws NamingException {
 108.             throw new UnsupportedOperationException("Not supported yet.");
 109.         }
 110.
 111.         public NameParser getNameParser(String name) throws NamingException {
 112.             throw new UnsupportedOperationException("Not supported yet.");
 113.         }
 114.
 115.         public NamingEnumeration<NameClassPair> list(Name name)
 116.                 throws NamingException {
 117.
 118.             throw new UnsupportedOperationException("Not supported yet.");
 119.         }
 120.
 121.         public NamingEnumeration<NameClassPair> list(String name)
 122.                 throws NamingException {
 123.
 124.             throw new UnsupportedOperationException("Not supported yet.");
 125.         }
 126.
 127.         public NamingEnumeration<Binding> listBindings(Name name)
 128.                 throws NamingException {
 129.
 130.             throw new UnsupportedOperationException("Not supported yet.");
 131.         }
 132.
 133.         public NamingEnumeration<Binding> listBindings(String name)
 134.                 throws NamingException {
 135.
 136.             throw new UnsupportedOperationException("Not supported yet.");
 137.         }
 138.
 139.         public Object lookup(Name name) throws NamingException {
 140.             throw new UnsupportedOperationException("Not supported yet.");
 141.         }
 142.
 143.         public Object lookup(String name) throws NamingException {
 144.
 145.             // 在这里将JNDI名帮定到实际的内容上
 146.             if (name == null) {
 147.                 throw new NamingException("Name must not be null.");
 148.             }else if(name.equals("Key")) {
 149.                 return "Value";
 150.             }else {
 151.                 throw new NamingException("Name \"" + name + "\" not found.");
 152.             }
 153.         }
 154.
 155.         public Object lookupLink(Name name) throws NamingException {
 156.             throw new UnsupportedOperationException("Not supported yet.");
 157.         }
 158.
 159.         public Object lookupLink(String name) throws NamingException {
 160.             throw new UnsupportedOperationException("Not supported yet.");
 161.         }
 162.
 163.         public void rebind(Name name, Object obj) throws NamingException {
 164.             throw new UnsupportedOperationException("Not supported yet.");
 165.         }
 166.
 167.         public void rebind(String name, Object obj) throws NamingException {
 168.             throw new UnsupportedOperationException("Not supported yet.");
 169.         }
 170.
 171.         public Object removeFromEnvironment(String propName)
 172.                 throws NamingException {
 173.
 174.             throw new UnsupportedOperationException("Not supported yet.");
 175.         }
 176.
 177.         public void rename(Name oldName, Name newName) throws NamingException {
 178.             throw new UnsupportedOperationException("Not supported yet.");
 179.         }
 180.
 181.         public void rename(String oldName, String newName)
 182.                 throws NamingException {
 183.
 184.             throw new UnsupportedOperationException("Not supported yet.");
 185.         }
 186.
 187.         public void unbind(Name name) throws NamingException {
 188.             throw new UnsupportedOperationException("Not supported yet.");
 189.         }
 190.
 191.         public void unbind(String name) throws NamingException {
 192.             throw new UnsupportedOperationException("Not supported yet.");
 193.         }
 194.
 195.
 196.     }
 197. }

最後用一段代码验证一下结果:

   1. public class Main {
   2.
   3.     /**
   4.      * @param args the command line arguments
   5.      */
   6.     public static void main(String[] args) {
   7.
   8.         // 启动JNDI资源
   9.         CustomizedInitialContextFactoryBuilder.initialize();
  10.
  11.         try {
  12.             InitialContext initialContext = new InitialContext();
  13.             System.out.println(initialContext.lookup("Key"));
  14.         }catch(Exception e) {
  15.             e.printStackTrace(System.err);
  16.         }
  17.     }
  18.
  19.
  20. }

打印出"Value",结果正确。

Clone this wiki locally