`
cyberblue
  • 浏览: 12381 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

创建JNDI Binding

阅读更多
开发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",结果正确。
0
0
分享到:
评论

相关推荐

    jndi-jar.zip

    例如,你可以通过JNDI查找或绑定文件和目录,实现文件资源的查找、创建、删除等操作。fscontext.jar提供了对文件系统的透明访问,使应用程序能够以统一的方式处理远程和本地资源。 2. providerutil.jar:这个JAR...

    jndi简明教程

    - **子上下文(Subcontext)**:子上下文是指在一个上下文中创建的另一个上下文。 #### 绑定与解析 在JNDI中,绑定和解析是最基本的操作之一。绑定将名字与对象相关联,而解析则是根据名字获取对象的过程。这两种...

    JNDI简介与SPI实现

    JNDI的核心概念包括命名空间(Name Space)、上下文(Context)和绑定(Binding)。命名空间是存储对象的名字集合,上下文是命名空间的实现,它提供查找、创建和删除绑定的方法。绑定是将一个名字与一个对象关联的...

    JNDI.rar_jndi

    JNDI的核心概念包括名称(Name)、上下文(Context)和绑定(Binding)。 1. 名称:在JNDI中,名称是一个层次结构的字符串,如“java:comp/env/jdbc/myDataSource”。这个名字由一系列的名称元素组成,每个元素代表...

    Weblogic Server下的JNDI.rar

    JNDI的核心概念包括命名上下文(Naming Context)、名字(Name)和绑定(Binding)。命名上下文是JNDI的基础,它是一个层次化的命名空间,其中可以包含其他命名上下文或绑定对象。名字用于唯一标识一个对象,而绑定...

    Hibernate常见的20个问题

    ### Hibernate常见问题解析 #### 一、Hibernate 初始化时出现错误代码...通过以上步骤,可以解决“Not binding factory to JNDI, no JNDI name configured”问题,并根据实际需求正确配置SessionFactory与JNDI的关系。

    bea jndi 培训

    - **binding**:在JNDI中,binding是指将一个名称(或称作JNDI名称)与一个对象关联起来。这个名字可以用来查找并访问该对象。 - **Resolve**:解析过程是通过JNDI名称查找并返回对应对象的过程。 - **Context**:...

    EJB3.0使用文档

    @RemoteBinding(jndiBinding = "foshanshop/RemoteOperation") public interface Operation { void performOperation(); } ``` - **客户端查找**: ```java InitialContext ctx = new InitialContext(); ...

    oracle文档与ajax文档

    "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)...

    weblogic10下配置Sql Server 数据源

    这通常在应用的`weblogic.xml`或`ejb-jar.xml`文件中完成,通过定义JNDI名称来引用数据源,例如`java:comp/env/jdbc/SQLServerDS`。 7. **启动和监控**: - 保存并激活你的配置更改。 - 启动WebLogic服务器,然后...

    JMS开发例子.pdf

    这段代码展示了如何通过JNDI查找连接工厂,创建队列连接、会话,以及发送TextMessage到名为"queue1"的队列。同样,接收端的代码会创建一个QueueReceiver,并监听该队列,当有新的消息到达时,它会调用消息的...

    修改jboss的默认端口

    在Windows环境下,我们可以创建一个`.bat`文件,通过命令行工具(如sed或awk)来查找并替换配置文件中的特定端口号。例如,以下是一个简单的bat脚本示例: ```batch @echo off setlocal enabledelayedexpansion set...

    weblogic8 API

    `NameClassPair`和`Binding`类则分别表示JNDI名称和绑定到名称的类。开发者可以使用这些类来管理应用中的数据源、JMS队列和话题等资源。 三、`weblogic.jdbc.jta`包: 这个包涉及到JDBC与JTA(Java Transaction API...

    J2ee API中文文档

    如JAF(JavaBeans Activation Framework)用于处理MIME类型的对象,JCA(Java Connector Architecture)用于与非Java系统集成,JAXP(Java API for XML Processing)和JAXB(Java Architecture for XML Binding)...

    j2ee14帮助文档

    8. **JAXB(Java Architecture for XML Binding)**:用于将Java对象转换为XML,反之亦然。在1.4版本中,JAXB允许开发者轻松地处理XML数据,促进了XML在企业应用中的使用。 9. **JSF(JavaServer Faces)**:这是一...

    J2EE1.5 api文档

    9. **JAFR(Java Architecture for XML Binding)**: JAFR提供了将XML文档与Java对象之间进行绑定的机制,简化了XML数据的处理。JAXB 1.0是J2EE 1.5的一部分,用于XML到Java对象的自动转换。 10. **JAX-RPC(Java...

    J2EE基础知识

    6. **JNDI(Java Naming and Directory Interface)**:JNDI为Java应用程序提供了一种查找和管理资源的接口。它可以用来查找EJB、数据源、邮件会话等服务。 7. **JAF(JavaBeans Activation Framework)**:JAF是...

    使用Java Web服务构建SOA源代码

    4. **JAXB(Java Architecture for XML Binding)**:JAXB是一个用于在Java对象和XML之间进行映射的标准API。它可以自动将Java对象转换为XML文档,反之亦然,简化了数据交换的过程。 5. **JNDI(Java Naming and ...

    javaEE 5帮助文档(html)从官网拉下来的

    10. **JNDI (Java Naming and Directory Interface)**:JNDI提供了一种查找和访问网络资源的统一方式,常用于在应用服务器中查找和管理EJB、数据源等。 在Eclipse中,可以直接将HTML版的JavaEE 5 API文档导入为帮助...

    javaee中文帮助文档

    3. **JNDI(Java Naming and Directory Interface)**:JNDI为Java应用程序提供了访问命名和目录服务的统一接口。它允许应用查找和绑定资源,如数据库连接池、EJBs(Enterprise JavaBeans)等。 4. **JMS(Java ...

Global site tag (gtag.js) - Google Analytics