开发J2EE程序时候,最让人头疼的莫过於各种各样的JNDI Binding,用得最多的一个类型要算DataSource,某些应用服务器上还有邮件服务、目录服务等等。
J2EE程序使用起来十分简单灵活,把服务器安装好然後把J2EE程序上传上去就可以了,比起PHP程序来要简单得多,但是在开发和测试时就要遇到各类名目繁多的概念和封装。一些非EJB项目,例如用Spring组织的项目,为了提高速度往往需要用一些静态变量,但是这些静态变量在程序装载和卸除时经常会出现一些奇怪的问题。
解决这些问题颇费周折,最好的方法莫过於把业务逻辑拿到应用服务器之外编写和测试,但是应用服务器一般都自带大量强大的JNDI资源,废弃不用的话产品会丢失不少卖点,将其模拟下来是最好的方法。一个项目甚至项目里的每个模块,在开发前期做好测试计划都是很有必要的,但这个话题太大了,这里写不了,我这里只写一些关於自己创建JNDI Binding的内容。
自己创建JNDI Binding需要建一大堆模型,至少需要InitialContextFactoryBuilder、InitialContextFactory和Context这三个,不可谓不复杂,但是其机制并不繁琐,只是想得周全一些罢了,例子代码如下:
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<NameClassPair> list(Name name)
throws NamingException {
throw new UnsupportedOperationException("Not supported yet.");
}
public NamingEnumeration<NameClassPair> list(String name)
throws NamingException {
throw new UnsupportedOperationException("Not supported yet.");
}
public NamingEnumeration<Binding> listBindings(Name name)
throws NamingException {
throw new UnsupportedOperationException("Not supported yet.");
}
public NamingEnumeration<Binding> 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.");
}
}
}
最後用一段代码验证一下结果:
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",结果正确。
分享到:
相关推荐
例如,你可以通过JNDI查找或绑定文件和目录,实现文件资源的查找、创建、删除等操作。fscontext.jar提供了对文件系统的透明访问,使应用程序能够以统一的方式处理远程和本地资源。 2. providerutil.jar:这个JAR...
- **子上下文(Subcontext)**:子上下文是指在一个上下文中创建的另一个上下文。 #### 绑定与解析 在JNDI中,绑定和解析是最基本的操作之一。绑定将名字与对象相关联,而解析则是根据名字获取对象的过程。这两种...
JNDI的核心概念包括命名空间(Name Space)、上下文(Context)和绑定(Binding)。命名空间是存储对象的名字集合,上下文是命名空间的实现,它提供查找、创建和删除绑定的方法。绑定是将一个名字与一个对象关联的...
JNDI的核心概念包括名称(Name)、上下文(Context)和绑定(Binding)。 1. 名称:在JNDI中,名称是一个层次结构的字符串,如“java:comp/env/jdbc/myDataSource”。这个名字由一系列的名称元素组成,每个元素代表...
JNDI的核心概念包括命名上下文(Naming Context)、名字(Name)和绑定(Binding)。命名上下文是JNDI的基础,它是一个层次化的命名空间,其中可以包含其他命名上下文或绑定对象。名字用于唯一标识一个对象,而绑定...
### Hibernate常见问题解析 #### 一、Hibernate 初始化时出现错误代码...通过以上步骤,可以解决“Not binding factory to JNDI, no JNDI name configured”问题,并根据实际需求正确配置SessionFactory与JNDI的关系。
- **binding**:在JNDI中,binding是指将一个名称(或称作JNDI名称)与一个对象关联起来。这个名字可以用来查找并访问该对象。 - **Resolve**:解析过程是通过JNDI名称查找并返回对应对象的过程。 - **Context**:...
@RemoteBinding(jndiBinding = "foshanshop/RemoteOperation") public interface Operation { void performOperation(); } ``` - **客户端查找**: ```java InitialContext ctx = new InitialContext(); ...
"Java中四种XML解析技术.doc"文件可能涵盖了Java中解析XML的四种主要方法:DOM(Document Object Model)、SAX(Simple API for XML)、StAX(Streaming API for XML)和JAXB(Java Architecture for XML Binding)...
这通常在应用的`weblogic.xml`或`ejb-jar.xml`文件中完成,通过定义JNDI名称来引用数据源,例如`java:comp/env/jdbc/SQLServerDS`。 7. **启动和监控**: - 保存并激活你的配置更改。 - 启动WebLogic服务器,然后...
这段代码展示了如何通过JNDI查找连接工厂,创建队列连接、会话,以及发送TextMessage到名为"queue1"的队列。同样,接收端的代码会创建一个QueueReceiver,并监听该队列,当有新的消息到达时,它会调用消息的...
在Windows环境下,我们可以创建一个`.bat`文件,通过命令行工具(如sed或awk)来查找并替换配置文件中的特定端口号。例如,以下是一个简单的bat脚本示例: ```batch @echo off setlocal enabledelayedexpansion set...
`NameClassPair`和`Binding`类则分别表示JNDI名称和绑定到名称的类。开发者可以使用这些类来管理应用中的数据源、JMS队列和话题等资源。 三、`weblogic.jdbc.jta`包: 这个包涉及到JDBC与JTA(Java Transaction API...
如JAF(JavaBeans Activation Framework)用于处理MIME类型的对象,JCA(Java Connector Architecture)用于与非Java系统集成,JAXP(Java API for XML Processing)和JAXB(Java Architecture for XML Binding)...
8. **JAXB(Java Architecture for XML Binding)**:用于将Java对象转换为XML,反之亦然。在1.4版本中,JAXB允许开发者轻松地处理XML数据,促进了XML在企业应用中的使用。 9. **JSF(JavaServer Faces)**:这是一...
9. **JAFR(Java Architecture for XML Binding)**: JAFR提供了将XML文档与Java对象之间进行绑定的机制,简化了XML数据的处理。JAXB 1.0是J2EE 1.5的一部分,用于XML到Java对象的自动转换。 10. **JAX-RPC(Java...
6. **JNDI(Java Naming and Directory Interface)**:JNDI为Java应用程序提供了一种查找和管理资源的接口。它可以用来查找EJB、数据源、邮件会话等服务。 7. **JAF(JavaBeans Activation Framework)**:JAF是...
4. **JAXB(Java Architecture for XML Binding)**:JAXB是一个用于在Java对象和XML之间进行映射的标准API。它可以自动将Java对象转换为XML文档,反之亦然,简化了数据交换的过程。 5. **JNDI(Java Naming and ...
10. **JNDI (Java Naming and Directory Interface)**:JNDI提供了一种查找和访问网络资源的统一方式,常用于在应用服务器中查找和管理EJB、数据源等。 在Eclipse中,可以直接将HTML版的JavaEE 5 API文档导入为帮助...
3. **JNDI(Java Naming and Directory Interface)**:JNDI为Java应用程序提供了访问命名和目录服务的统一接口。它允许应用查找和绑定资源,如数据库连接池、EJBs(Enterprise JavaBeans)等。 4. **JMS(Java ...