2011-03-04 21 views
6

Tengo un problema al configurar mi configuración para JNDI con Spring. Revisé las otras publicaciones pero no pude resolver mi problema. Estoy usando Tomcat 6 como mi contenedor. Según tengo entendido, necesito configurar un recurso en el servidor. Así que en mi archivo server.xml tengo esto:Spring Jndi Configuration, Server.xml

<GlobalNamingResources> 
    <Resource auth="Container" driverClassName="org.postgresql.Driver" 
      maxActive="100" maxIdle="5" maxWait="10000" 
      minEvictableIdleTimeMillis="60000" name="jdbc/myTomcatPool" 
      password="password" testOnBorrow="true" testWhileIdle="true" 
      timeBetweenEvictionRunsMillis="10000" type="javax.sql.DataSource" 
      url="jdbc:postgresql://localhost:5432/postgis" username="postgres" 
      validationQuery="SELECT 1"/> 
</GlobalNamingResources> 

Tengo el siguiente en mi spring-context.xml (que está en la ruta de clase):

<jee:jndi-lookup id="geoCodeData" jndi-name="java:comp/env/jdbc/myTomcatPool" /> 

<bean id="geoCodeService" class="com.sample.SampleImpl"> 
    <property name="dataSource" ref="geoCodeData"/> 
</bean> 

Entonces tengo esto en el archivo META-INF/context.xml:

<Context path="/myApp" reloadable="true" cacheMaxSize="51200" 
     cacheObjectMaxSize="2560"> 
    <ResourceLink global="jdbc/myTomcatPool" name="jdbc/myTomcatPool" 
      type="javax.sql.DataSource"/> 
</Context> 

Mi servidor se inicia sin errores.

Cuando trato de ejecutar la siguiente prueba (que funcionaba antes de agregar el código JNDI):

public class Test { 
    public static void main(String[] args) { 
     ApplicationContext ctx = 
      new ClassPathXmlApplicationContext("spring-context.xml"); 
    } 
} 

me sale el siguiente error:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'geoCodeData': Invocation of init method failed;

nested exception is javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

Es mi configuración incorrecta o es el Cómo estoy tratando de ejecutar la prueba incorrecta?

Respuesta

11

Cuando ejecute sus cajas de prueba, querrá usar JDBC en lugar de la búsqueda JNDI. La razón simple es porque generalmente no ejecuta sus archivos de prueba desde el servidor de aplicaciones. Por lo tanto, la búsqueda JNDI fracasará.

Lo que hago en mi extremo es colocar la fuente de datos en un archivo separado. Tengo un archivo para la producción que utiliza JNDI: -

proyecto datasource.xml

<jee:jndi-lookup id="geoCodeData" jndi-name="java:comp/env/jdbc/myTomcatPool"></jee:jndi-lookup> 

... otro otro archivo para la prueba de unidad que utiliza JDBC: -

proyecto- fuente de datos-test.xml

// use the same bean name "geoCodeData" 
<bean id="geoCodeData" class="..."> 
    <property name="driverClassName" value="..." /> 
    <property name="url" value="..." /> 
    <property name="username" value="..." /> 
    <property name="password" value="..." /> 
</bean> 

La aplicación web usará pr oject-datasource.xml mientras que la prueba unitaria usará project-datasource-test.xml.

+0

Eso tiene sentido. Pensé que podría tener que ver solo con el caso de prueba. Voy a intentar esto. Voy a marcar esto como la respuesta. Gracias de nuevo. Una última pregunta, ¿agregaría el proyecto-datasource.xml a mi lista de contextConfigLocation en mi web.xml y usaría project-datasource-test.xml en mis clases de prueba como mi ejemplo? – blong824

+1

¡Qué solución tan inteligente! Por cierto, puede consultar el archivo de fuente de datos recién creado en su configuración de aplicación xml usando: '' y los similares. ¡Aclamaciones! – acdcjunior

3

Después de varias horas de arrancar mi pelo (ya escaso), he conseguido que mi servidor tomcat integre las conexiones de la base de datos con Oracle y utilice el marco Spring. Pensé que respondería a esta pregunta a pesar de que parece haber una respuesta, por si acaso ayudó a alguien más.

Lo que quería: Un conjunto de conexiones administrado por Tomcat (en lugar de por servlet) y la configuración para la conexión DB en la configuración del servidor Tomcat (nuevamente, en lugar de los archivos de configuración de servlet).

Tenemos varias instancias de Tomcat y cada una se conecta a un Oracle DB específico, pero los desarrolladores están produciendo servlets que podrían requerirse para ejecutar en cualquiera de ellos, por lo tanto no quiero los detalles de conexión de DB en WAR archivo que producen, pero que les permita buscarlo y recibir el origen de datos de ese servidor a través de JNDI.

En el servidor Tomcatconf/context.xml I añade el siguiente código:


<Resource  name="jdbc/banner" 
       auth="Container" 
      factory="org.apache.commons.dbcp.BasicDataSourceFactory" 
        type="javax.sql.DataSource" 
        driverClassName="oracle.jdbc.OracleDriver" 
        url="jdbc:oracle:thin:@DBan8DB1.example.ac.uk:1522:bde8" 
      username="dbsro" 
      password="verysecret" 
      initialSize="5" 
      maxActive="20" 
      maxIdle="10" 
      removeAbandoned="true" 
      global="jdbc/banner" 
      maxWait="-1"/> 

Obviamente tengo los archivos JAR ojdbc, piscina y DBCP presentes en lib directorio de Tomcat en el servidor. Un punto importante a tener en cuenta aquí es que el type es de "javax.sql.DataSource" en lugar de "org.apache.commons.dbcp.BasicDataSource" que originalmente pensé que debería ser.

Ahora en la web deWEB-INF/web.xml aplicación que añade lo siguiente:


<resource-ref> 
     <description>Oracle Banner Datasource</description> 
     <res-ref-name>jdbc/banner</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
    </resource-ref> 

y en mi Web archivo de aplicaciónservlet-context.xml (donde quiera que guardarán la vuestra puede variar) que tenía esta. Esto no es todo el archivo, pero el espacio de nombres XML es importante en este caso, para las partes jee:


<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 


<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/banner" resource-ref="true" /> 

Observamos una vez más la referencia completo jndi-name="java:comp/env/jdbc/banner" que parecía ser necesario. ¿Por qué no se necesita en la sección de referencia de recursos del archivo web.xml? No tengo ni idea.

Si alguien tiene alguna idea al respecto, me gustaría leerlos.

Por cierto, este URL ayudaron: Tomcat6 JNDI data source how-to

Después de todo eso, la conexión trabajó. Así que limpié la sangre, el sudor y las lágrimas de mi estación de trabajo y disfruté de una deliciosa taza de café recién hecho.

+0

¡Esto me ayudó mucho! –

Cuestiones relacionadas