开发J2EE程序时候,最让人头疼的莫过於各种各样的JNDI Binding,用得最多的一个类型要算DataSource,某些应用服务器上还有邮件服务、目录服务等等。
J2EE程序使用起来十分简单灵活,把服务器安装好然後把J2EE程序上传上去就可以了,比起PHP程序来要简单得多,但是在开发和测试时就要遇到各类名目繁多的概念和封装。一些非EJB项目,例如用Spring组织的项目,为了提高速度往往需要用一些静态变量,但是这些静态变量在程序装载和卸除时经常会出现一些奇怪的问题。
解决这些问题颇费周折,最好的方法莫过於把业务逻辑拿到应用服务器之外编写和测试,但是应用服务器一般都自带大量强大的JNDI资源,废弃不用的话产品会丢失不少卖点,将其模拟下来是最好的方法。一个项目甚至项目里的每个模块,在开发前期做好测试计划都是很有必要的,但这个话题太大了,这里写不了,我这里只写一些关於自己创建JNDI Binding的内容。
自己创建JNDI Binding需要建一大堆模型,至少需要InitialContextFactoryBuilder、InitialContextFactory和Context这三个,不可谓不复杂,但是其机制并不繁琐,只是想得周全一些罢了,例子代码如下:
Java代码
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 list(Name name)
116. throws NamingException {
117.
118. throw new UnsupportedOperationException(“Not supported yet.”);
119. }
120.
121. public NamingEnumeration list(String name)
122. throws NamingException {
123.
124. throw new UnsupportedOperationException(“Not supported yet.”);
125. }
126.
127. public NamingEnumeration listBindings(Name name)
128. throws NamingException {
129.
130. throw new UnsupportedOperationException(“Not supported yet.”);
131. }
132.
133. public NamingEnumeration 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. }
package testjndi;
import java.util.Hashtable;
import javax.naming.Binding;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.NameClassPair;
import javax.naming.NameParser;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.spi.InitialContextFactory;
import javax.naming.spi.InitialContextFactoryBuilder;
import javax.naming.spi.NamingManager;
/**
*
* @author
*/
public class CustomizedInitialContextFactoryBuilder
implements InitialContextFactoryBuilder {
public static void initialize() {
try {
// 覆盖原先的设置
NamingManager.setInitialContextFactoryBuilder(
new CustomizedInitialContextFactoryBuilder());
}catch(Exception e) {
e.printStackTrace(System.err);
}
}
public InitialContextFactory createInitialContextFactory
(Hashtable environment) throws NamingException {
return new MyCustomizedInitialContextFactory();
}
private class MyCustomizedInitialContextFactory
implements InitialContextFactory {
public Context getInitialContext(Hashtable environment)
throws NamingException {
CustomizedContext customizedContext
= new CustomizedContext();
return customizedContext;
}
}
private class CustomizedContext implements Context {
public Object addToEnvironment(String propName, Object propVal)
throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void bind(Name name, Object obj) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void bind(String name, Object obj) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void close() throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public Name composeName(Name name, Name prefix) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public String composeName(String name, String prefix)
throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public Context createSubcontext(Name name) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public Context createSubcontext(String name) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void destroySubcontext(Name name) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void destroySubcontext(String name) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public Hashtable getEnvironment() throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public String getNameInNamespace() throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public NameParser getNameParser(Name name) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public NameParser getNameParser(String name) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public NamingEnumeration list(Name name)
throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public NamingEnumeration list(String name)
throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public NamingEnumeration listBindings(Name name)
throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public NamingEnumeration listBindings(String name)
throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public Object lookup(Name name) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public Object lookup(String name) throws NamingException {
// 在这里将JNDI名帮定到实际的内容上
if (name == null) {
throw new NamingException(“Name must not be null.”);
}else if(name.equals(“Key”)) {
return “Value”;
}else {
throw new NamingException(“Name \”" + name + “\” not found.”);
}
}
public Object lookupLink(Name name) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public Object lookupLink(String name) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void rebind(Name name, Object obj) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void rebind(String name, Object obj) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public Object removeFromEnvironment(String propName)
throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void rename(Name oldName, Name newName) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void rename(String oldName, String newName)
throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void unbind(Name name) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
public void unbind(String name) throws NamingException {
throw new UnsupportedOperationException(“Not supported yet.”);
}
}
}
最後用一段代码验证一下结果:
Java代码
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. }
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// 启动JNDI资源
CustomizedInitialContextFactoryBuilder.initialize();
try {
InitialContext initialContext = new InitialContext();
System.out.println(initialContext.lookup(“Key”));
}catch(Exception e) {
e.printStackTrace(System.err);
}
}
}
打印出”Value”,结果正确。