Estoy tratando de encontrar la mejor manera de pasar configuraciones complejas en una Primavera webapp que se ejecuta en Tomcat. Actualmente yo uso JNDI para pasar los datos de las fuentes y de las cadenas del Tomcat contexto dentro de la webapp, y funciona bien.

Pero, digamos que tengo que seleccionar la implementación de un servicio de notificación. No hay manera de que la Primavera puede condicionalmente seleccionar que bean para instanciar (aunque en el pasado he utilizado un JNDI cadena para importar una configuración predefinida de los granos mediante el establecimiento de contextConfigLocation).

También he visto muchas webapps que el suministro de una herramienta de configuración que se va a crear una costumbre de la GUERRA de archivo. En mi opinión esta es una mala forma, si por ninguna otra razón que impide el despliegue de las Guerras de aguas sin muchos controles para asegurar que toda la configuración se ha aplicado de nuevo.

Lo ideal sería ser capaz de suministrar una Primavera archivo XML que existía en el sistema de ficheros, fuera de la webapp. Pero, en la primavera de importación de la directiva no parece resolver ${} las variables, lo que es imposible para el suministro de personalizaciones.

¿Hay alguna de las técnicas que se pueden emplear aquí correctamente separadas configuración compleja de la webapp?

InformationsquelleAutor Nigel | 2009-11-12

3 Comentarios

  1. 12

    Si tengo un conjunto específico de frijoles que me gustaría configurar, y esta configuración debe ser separado de la GUERRA de archivo, normalmente lo hago en las siguientes:

    En applicationContext.xml:

    <!-- here you have a configurer based on a *.properties file -->
    <bean id="configurer" 
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="file://${configDir}/configuration.properties"/>
        <property name="ignoreResourceNotFound" value="false" />
        <property name="ignoreUnresolvablePlaceholders" value="false" />
        <property name="searchSystemEnvironment" value="false" />
    </bean>
    
    <!-- this is how you can use configuration properties -->
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="${smtp.host}"/>
    </bean>

    En de configuración.propiedades:

    smtp.host=smtp.your-isp.com

    También se necesita para arrancar el Tomcat con -DconfigDir=/ruta/a/configuración/directorio de

    • ¿No sería incluso «eleganter», para usar una classpath: URI para el archivo de propiedades, por lo que sólo se pueden colocar en algún lugar de la ruta de clases y evitar tocar el violín con el Tomcat parámetros de inicio?
    • Bien, hay una manera de conseguir algo en el Tomcat classpath sin que esté en la GUERRA? Sé que no es compartida/lib o common/lib hay clases equivalentes?
    • Nota para el auto, en Tomcat 6.0 es ${catalina.home}/lib. Gracias por la ayuda, creo que esto va a funcionar.
  2. 3

    Si usted está usando Spring 3, usted puede tomar ventaja de la Primavera Lenguaje de Expresión. Digamos que usted tiene dos aplicaciones de app1.la guerra y la app2.la guerra y los que requieren propiedades de un archivo llamado config.propiedades. Las aplicaciones que se implementarán con el contexto caminos /app1 y /app2.

    Crear dos directorios de app1 y app2 en un directorio común, por ejemplo. C:\myConfig\app1 y C:\myConfig\app2.

    Poner config.propiedades dentro de app1 y otro de configuración.propiedades dentro de app2.

    A continuación, cree un archivo ${CATALINA_HOME}/conf/[enginename]/[nombre de host]/contexto.xml.por defecto con el siguiente contenido:

    contexto.xml.valor predeterminado:

    <Context>
      <Parameter name="myConfigDirectory" value="C:/myConfig" override="false"/>
    </Context>

    El parámetro myConfigDirectory estará disponible para todas las aplicaciones en el host. Es mejor crear este parámetro en el contexto.xml.por defecto, en lugar de en server.xml porque el archivo se puede cambiar posteriormente sin necesidad de reiniciar tomcat.

    En el applicationContext.xml dentro de la guerra puede acceder a config.usando las propiedades de la SpEL expresión: «#{contextParameters.myConfigDirectory + servletContext.contextPath}/config.propiedades», así, por ejemplo, se puede escribir:

    applicationContext.xml:

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="location" value="file:#{contextParameters.myConfigDirectory + servletContext.contextPath}/config.properties" />
    </bean>

    La expresión ampliada a C:/myConfig/app1 para la aplicación con contextPath /app1, y C:/myConfig/app2 para la aplicación con contextPath /app2. Esto hará que las aplicaciones tener acceso a la configuración.propiedades de archivo en función de su contextPath.

  3. 0

    Si quieres ser totalmente portátil entre contenedores web no se puede confiar en cualquier cosa fuera de su GUERRA de archivo. En Tomcat el SecurityManager permite descubrir la ubicación física en el disco donde el código se implementa, y entonces usted puede utilizar ese conocimiento para navegar por el disco a una ubicación donde el archivo de configuración se coloca.

    Ver, por ejemplo, Determinar la ubicación de una clase de java cargado de Matlab

Dejar respuesta

Please enter your comment!
Please enter your name here