2010-08-04 18 views
93

Actualmente estamos escribiendo una aplicación que se divide en múltiples proyectos/módulos. Por ejemplo, tomemos los siguientes módulos:Uso de múltiples archivos de propiedades (a través de PropertyPlaceholderConfigurer) en múltiples proyectos/módulos

  • myApp-DAO
  • myApp-jabber

Cada módulo tiene su propio archivo XML contexto primavera. Para el módulo DAO tengo un PropertyPlaceholderConfigurer que lee un archivo de propiedad con los parámetros de conexión db necesarios. En el módulo jabber también tengo PropertyPlaceHolderConfigurer para las propiedades de conexión de jabber.

Ahora viene la aplicación principal que incluye myApp-DAO y myApp-jabber. Lee todos los archivos de contexto y comienza un gran contexto de primavera. Desafortunadamente, parece que solo puede haber un PropertyPlaceholderConfigurer por contexto, por lo que el módulo que se cargue primero podrá leer sus parámetros de conexión. El otro arroja una excepción con un error como "No se pudo resolver el marcador de posición 'jabber.host'"

Entiendo el problema, pero realmente no sé una solución, o la mejor práctica para mi usecase

¿Cómo podría configurar cada módulo para que cada uno pueda cargar su propio archivo de propiedades? En este momento, he movido el PropertyPlaceHolderConfigurer fuera de los archivos de contexto separados y los he fusionado en el contexto de la aplicación principal (cargando todos los archivos de propiedades con un solo PropertyPlaceHolderConfigurer). Esto apesta, porque ahora todos los que usan el módulo dao tienen que saber que necesitan un PropertyPlaceHolderConfigurer en su contexto ... también fallan las pruebas de integración en el módulo dao, etc.

Tengo curiosidad por saber sobre soluciones/ideas de la comunidad stackoverflow ...

+7

1 para el uso de la palabra "chupar" :-D –

+0

@PeterWippermann ¿Por qué no se negrita? : D – Nabin

Respuesta

158

Si se asegura de que cada marcador de posición, en cada uno de los contextos involucrados, esté ignorando las claves no resueltas, entonces estos dos enfoques funcionan. Por ejemplo:

<context:property-placeholder 
location="classpath:dao.properties, 
      classpath:services.properties, 
      classpath:user.properties" 
ignore-unresolvable="true"/> 

o

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>classpath:dao.properties</value> 
       <value>classpath:services.properties</value> 
       <value>classpath:user.properties</value> 
      </list> 
     </property> 
     <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    </bean> 
+10

Aquí hay una entrada útil sobre el tema que debería ayudarlo a resolver estos problemas: http://tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html –

+1

¡GRACIAS! ignore-unresolvable = "true" era exactamente lo que necesitaba y ¡funcionó! – black666

+1

Si agrega todos los archivos en 1 etiqueta, entonces no necesita el evento 'ignore-unresolvable =" true "', de lo contrario necesitaría. –

4

El bean PropertiesPlaceholderConfigurer tiene una propiedad alternativa llamada "propertiesArray". Utilice esto en lugar de la propiedad "propiedades" y configúrelo con un <array> de referencias de propiedades.

8

Puede tener varios elementos <context:property-placeholder /> en lugar de declarar explícitamente múltiples beans PropertiesPlaceholderConfigurer.

+5

Tenga cuidado con las limitaciones: http://stackoverflow.com/a/1473329/603516 – Vadzim

+0

Intenté usar dos elementos y spring se quejó de que no podía identificar la propiedad especificada. Tengo que implementar la respuesta aceptada para que funcione. – Mushy

17

Yo sé que esto es una cuestión de edad, pero la propiedad ignore-unresolvable no funcionaba para mí y yo no sabía por qué.

El problema era que necesitaba un recurso externo (algo así como location="file:${CATALINA_HOME}/conf/db-override.properties") y el ignore-unresolvable="true" no hace el trabajo en este caso.

Lo que uno tiene que hacer para ignorar un recurso externo que falta es:

ignore-resource-not-found="true" 

por si alguien else golpes en esto.

+3

'ignore-unresolvable' y' ignore-resource-not-found' sirven para diferentes propósitos. Para evitar errores cuando la propiedad ** file ** no existe, use 'ignore-resource-not-found =" true "'. Para evitar errores cuando utiliza una propiedad que no existe _en el archivo_, use 'ignore-unresolvable =" true "'. Si tiene varios archivos que contienen conjuntos parciales de propiedades y cada archivo puede existir o no, deberá usar ambos. – datguy

0

He intentado la solución a continuación, funciona en mi máquina.

<context:property-placeholder location="classpath*:connection.properties" ignore-unresolvable="true" order="1" /> 

<context:property-placeholder location="classpath*:general.properties" order="2"/> 

En caso de múltiples elementos están presentes en el contexto Spring, hay algunas mejores prácticas que deberían ser siguieron:

atributo

el orden necesita ser especificado para fijar el orden en que estos son procesados ​​por Spring todos los marcadores de posición menos el último uno (orden más alta) debe tener ignore-unresolvable=”true” para permitir el mecanismo de resolución para pasar a otros en el contexto sin lanzando una excepción

fuente: http://www.baeldung.com/2012/02/06/properties-with-spring/

+0

¿Se solicita el pedido especificado? Intenté esto y la jvm se quejó. – Mushy

Cuestiones relacionadas