javax.naming.NameNotFoundException Name java:comp is not bound in this Context之解决

Spring mvc项目调试的时候,常用的两种方法是:

一、使用tomcat插件

(1)、下载tomcat插件,http://www.eclipsetotale.com/tomcatPlugin.html,然后解压缩后放在F:\eclipse-jee-juno-SR1-win32\eclipse\dropins下面即可

(2)、重启eclipse,就会看到上面的工具栏有3个tomcat的图标了

(3)、然后需要配置windowsàpreferencesàtomcat  路径指向tomcat的安装目录

(4)、最后tomcat/conf/server.xml加上当前项目生成的war,比如:

 

(5)、点击eclipse上的tomcat图标,就可以启动我们的项目了,打开浏览器,java代码里加上断点,就可以访问和调试程序了。

比如:http://localhost:8080/figo/version/toInsertVersion.htm就可以调试当前这个action了。

这种方法的缺点就是,页面上改个文字也要maven install –Dmaven.test.skip=true重新生成war,才能看到效果,个人建议不要使用这种方式。

二、使用eclipse自带的Debug on Server

个人比较推荐使用这种方式,开发效率比较高,不用向上面那样,每次都要整个项目重新生成一下,这种方式,改了之后直接Debug on Server就可以看到效果了。之所以写这篇文章,是因为今天使用这种方式,项目里面使用了jndi配置数据源的时候出现了。

javax.naming.NameNotFoundException: Name java:compis not bound in this Context

 

这个异常,折腾了一个下午,终于在同事的帮助下解决,这里分享出来,希望能解大家的燃眉之急。

虽然我们一般把jndi配置在tomcat,conf/context.xml文件上的,比如:

                   auth="Container"

                  type="javax.sql.DataSource"

                  driverClassName="oracle.jdbc.driver.OracleDriver"

                  url="jdbc:oracle:thin:@10.136.123.123:1521:dsdb1"

                   username="tester"

                   password=" tester "

                   maxActive="5"

                   maxIdle="1"

                  maxWait="10000" />

但是使用Debug on server之后,就找不到了,也许是使用这种方式之后,spring框架找不到配置吧。

 

解决办法:

1、 把jndi的数据源配置写入一个xml配置文件jndi-context.xml,

 xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:task="http://www.springframework.org/schema/task"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:jaxws="http://cxf.apache.org/jaxws"

    xmlns="http://www.springframework.org/schema/beans"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

               http://www.springframework.org/schema/tx

         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

               http://www.springframework.org/schema/context

               http://www.springframework.org/schema/context/spring-context-3.0.xsd

                  http://www.springframework.org/schema/task

                  http://www.springframework.org/schema/task/spring-task-3.0.xsd

                  http://www.springframework.org/schema/aop

                  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

                  http://cxf.apache.org/core

                  http://cxf.apache.org/schemas/core.xsd

                  http://cxf.apache.org/jaxws

                  http://cxf.apache.org/schemas/jaxws.xsd">

                 

 

    <beanid="jndiContext"class="com.figo.commons.springtools.base.JndiContextMock"init-method="init">

       <propertyname="contextMap">

           <map>

              <entry key="java:comp/env/figoDataSource">和数据源配置文件figo-datasource.xml里面名称要保持一致-->

                  <bean class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">

                      <property name="driverClassName"value="oracle.jdbc.driver.OracleDriver"/>

                      <property name="url"value="jdbc:oracle:thin:@10.136.123.123:1521:dsdb1"/>

                      <property name="username"value="tester"/>

                      <property name="password"value="tester "/>

                      <property name="initialSize"value="5"/>

                      <property name="maxActive"value="5"/>

                      <property name="maxIdle"value="2"/>

                      <property name="maxWait"value="5000"/>

                  bean>

              entry>

             

           map>

       property>

    bean>

beans>

 

注意:

applicationContext.xml里面要加上

 

 

2、 加载类com.figo.commons.springtools.base.JndiContextMock.java

package  com.figo.commons.springtools.base;

import java.util.Map;

import java.util.Map.Entry;

import javax.naming.NamingException;

importorg.springframework.mock.jndi.SimpleNamingContextBuilder;

 

public class JndiContextMock

{

 private Map contextMap;

 

 public void init()

 {

   SimpleNamingContextBuilder builder;

   try

   {

     builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();

   } catch (NamingException e) {

     throw new Exception("初始化JNDI上下文环境时发生异常:"+e);

   }

 

   for (Map.Entry contextEntry : this.contextMap.entrySet())

     builder.bind((String)contextEntry.getKey(), contextEntry.getValue());

 }

 

 public void setContextMap(Map contextMap)

 {

   this.contextMap = contextMap;

 }

}

 

3、 数据源配置figo-datasource.xml

 xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:osgi="http://www.springframework.org/schema/osgi"

    xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/osgihttp://www.springframework.org/schema/osgi/spring-osgi.xsd"

    default-autowire="byName">

   

      

   

   

    <beanid="figoDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

       <propertyname="jndiName">

           <value>java:comp/env/figoDataSourcevalue>

       property>

    bean>

   

    <beanid="figoSqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

        <propertyname="configLocation">

            <value>classpath:META-INF/spring/sqlmap-figo.xmlvalue>

        property>

    bean>

   

   

    <beanid="figoBaseSqlMapClientDAO"abstract="true">

       <propertyname="sqlMapClient"ref="figoSqlMapClient">property>

       <propertyname="dataSource"ref="figoDataSource"/>

    bean>

   

   

    <beanid="figoTransactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <propertyname="dataSource"ref="figoDataSource"/>

    bean>

    <beanname="figoTransactionTemplate"class="org.springframework.transaction.support.TransactionTemplate">

       <propertyname="transactionManager"ref="figoTransactionManager"/>

    bean>

beans>

 

你可能感兴趣的:(java开发步步为营)