2010-11-30 9 views
6

utilizo primavera configurar mi aplicación web de Java y en mi configuración de Spring Me obtener una fuente de datos a través de JNDI para el embarcadero de la siguiente manera:Tomcat vs embarcadero JNDI de búsqueda

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myDataSource" />

pero esto no va a funcionar con Tomcat . Con el Tomcat que tengo que hacer esto:

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

Cuál es la mejor manera de resolver esto? Ya estoy usando JNDI como una forma de externalizar la configuración, ¡así que no puedo externalizar mi configuración externalizada! Al mismo tiempo, aborrezco la idea de tener dos archivos de configuración de Spring por separado. ¡¡¡AYUDA!!!

Respuesta

7

encontré una respuesta here, pero pensé que era un poco complicado, pero me dio la idea de utilizar el clase cool ServerDetector ese blogger había encontrado.

Una vez que puedo calcular de forma dinámica qué tipo de servidor que estoy corriendo, yo era capaz de utilizar el lenguaje de expresión de primavera para hacer el resto de la obra:

<jee:jndi-lookup id="myAppDataSource" 
    jndi-name="#{ (AppServerType == 'Jetty' ? 'jdbc/' : 'java:comp/env/jdbc/') + 
        'myAppDataSource' }" /> 

fácil!

1

La forma más limpia de hacerlo es configurar su configuración. ;)

Utilice un soporte de posición de primavera. Ver

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-placeholderconfigurer

La idea básica es que sólo hay que poner un marcador de posición en su configuración de la primavera con una propiedad, y luego se lee la propiedad de contrapartida de un archivo de propiedades. Generas el archivo de propiedades en tu proceso de compilación. Lo he visto hecho donde la herramienta de compilación (ant) lee una variable de entorno y luego crea un archivo de propiedades apropiado para el entorno basado en un archivo esqueleto poblado con tokens.

+0

¿Está diciendo que luego use este valor del marcador de posición de la propiedad como jndi-name? ¿O omitir JNDI por completo? – HDave

+1

@hdave, configure jndi-name para ser = "{jndi.name}", donde jndi.name es una propiedad de un archivo de compilación que genera su proceso de compilación. Parece que resolvió el problema, pero esta técnica definitivamente será útil para usted eventualmente. – hvgotcodes

+0

Creo que lo haré ya que me moveré hacia el soporte para Websphere pronto y entiendo que tiene su propio enfoque funky hacia las rutas JNDI. – HDave

4

Después de experimentar, descubrí que podía forzar a Jetty a usar la misma ruta JNDI que Tomcat. El siguiente fragmento es de mi jetty-env.xml archivo:

<New id="myDataSource" class="org.mortbay.jetty.plus.naming.Resource"> 
    <!-- We MUST specify the entire JNDI path here to force compliance with the Tomcat/J2EE convention --> 
    <Arg>java:comp/env/jdbc/myDataSource</Arg> 
    <Arg> 
    <New class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean"> 
    <Set name="uniqueResourceName">sbeDatabase</Set> 
       ............... 
    </New> 
    </Arg> 
</New> 

No estoy seguro si esto es ideal, pero funciona.

actualización:

Funciona si usted pone su archivo de muelle de una env.xml dentro de la GUERRA ... pero por alguna razón, uno se mueva esta configuración fuera de la guerra y en un archivo de contexto en el fragmento directorio del embarcadero "contextos", entonces se produce una excepción:

Hay que ver: http://jira.codehaus.org/browse/JETTY-273

+0

Me gusta esto porque no depende de ese cáncer xml que es Spring. –

Cuestiones relacionadas