关于JNDI配置以及运行报错详解

      在介绍JNDI配置之前,先让我好好吐槽一下。先说说今天在Java社区里面逛,看到关于数据库连接池的技术已经发展到好几种了,还停留在dbcp技术的我也没脸说什么。得知现在Apache下的tomcat在7.0版本的时候已经推出了新的连接池技术-tomcatJDBC。

     啥也没说,上手就开始干了。上网一搜tomcatJDBC的配置,一看一大把,瞬间心里各种感动啊。随便打开一个就跟着开始配置起来。具体配置的方式我还是先简单说一下吧,具体也正如网上说的,tomcatJDBC的配置方式分成两种。第一种就是直接用Java代码写,第二种就是采用JNDI配置方式的,所谓JNDI呢,就是Java Naming and Directory Interface。啥也别说,作为一个向往Java大神的我来说自然是采用第二种了。

好了,言归正传,具体配置过程呢,就是新了一个context.xml放在web工程下的META-INF这个文件夹下,这个XML文件里面具体配置的当然就是TomcatJDBC的一些参数了,具体与本文无关我也就不多讲了。那么问题就来了。当我配置完之后,直接新建了一个带Main()函数的类就是测试了。

这个类如下,很简单:

关于JNDI配置以及运行报错详解_第1张图片

系统马上就给报了个错,错误如下:关于JNDI配置以及运行报错详解_第2张图片

看到错误之后呢,心情也没那么差,想想网上还有这么多资料呢。于是,开始了无穷无尽的打开一个又一个内容一样的资料,心里就开始了一万只草泥马在奔腾啊。心想这些人都是什么素质啊,全TM都是复制转载,每篇博客里面连TM错别字也一样,我也是醉了。这也是我今天想写下这篇博客的原因。我真的是很想吐槽一下现在网上的这个学习环境,你说你写博客不就是在教别人知识么,为嘛要写的这么简单,就只是告诉人家代码是这样就完了,就不能多加一句解释这些代码是干嘛的,为什么要这样写么?充当大神怕掉面子?这对于我们这些初学者来说实在是太不友好了。

好了,言归正传,我还是先不吐槽了,把问题说清楚吧。eclipse报了这个错,我就开始在网上查,好吧,又是一把辛酸泪,每篇文章没解释对先不说,还都TM的是一样,有的不好意思,还加了句,是我在做项目时遇到的问题,后来用了这种方法解决了,我TM就想问一句,你确定是做了吗?别祸害我们这些不懂的小盆友了啦!

好吧,度娘不靠谱,还是得靠自己,仔细阅读了一下报的错,翻译成汉语意思就是:需要去具体说明类的名字在环境或者系统属性中,报的异常是NoInitialContextException。错误的语句是这句话,DataSource source=(DataSource)ct.lookup("java:comp/env/jndi/test"),核心呢就是InitialContext这个对象了,没办法只有去查JDK官方文档了,还官方文档靠谱,原文记载如下:在InitialContext对象进行初始化时如果初始化不成功或者对象 进行某种操作时无措就会报这个异常。这句代码的意思呢可以分成如下两步:

Context con = ct.lookup("java:comp/env");

DataSource datasource = con.lookup("jndi/test");

显然就是第一句话错了呗,为啥第一句错了,路径参数也没写错啊,那肯定就是Initialcontext这个对象在初始化的时候就错了,这时一切就都说得过去了。

言归正传,开始思考为啥 Context ct = new InitialContext();这句代码就不对了咧,折腾了一下午才发现,原来是这个东西在作怪


在运行这个main函数条件下,new Context()时,系统就无法从System.properties中读取正确的JNDI参数了,所以你之前配置放在META-INF下的context.xml自然就加载不进去,这样就难怪系统会报这个错了。


解决办法:

程序不变,只要不是用Java application运行的就是OK 了。很简单吧

你可能感兴趣的:(JNDI配置)