java - leer - Uso de múltiples archivos de propiedades(a través de PropertyPlaceholderConfigurer) en múltiples proyectos/módulos
leer properties java spring (5)
Actualmente estamos escribiendo una aplicación que se divide en múltiples proyectos / módulos. Por ejemplo, tomemos los siguientes módulos:
- myApp-DAO
- myApp-jabber
Cada módulo tiene su propio archivo xml de contexto de 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 conozco una solución, ni la mejor práctica para mi caso de uso.
¿Cómo configuraría 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 conocer las soluciones / ideas de la comunidad stackoverflow.
El bean PropertiesPlaceholderConfigurer
tiene una propiedad alternativa llamada "propertiesArray". Use esto en lugar de la propiedad "propiedades" y configúrelo con una <array>
de referencias de propiedades.
Intenté 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 que existan varios elementos en el contexto de Spring, hay algunas mejores prácticas que se deben seguir:
el atributo de orden debe especificarse para corregir el orden en el que Spring procesa todos los marcadores de posición menos el último (orden más alto) debe tener
ignore-unresolvable=”true”
para permitir que el mecanismo de resolución pase a otros en el contexto sin lanzar una excepción
fuente: http://www.baeldung.com/2012/02/06/properties-with-spring/
Puede tener múltiples elementos <context:property-placeholder />
lugar de declarar explícitamente múltiples beans PropertiesPlaceholderConfigurer.
Sé que esta es una vieja pregunta, pero la propiedad ignore-unresolvable
no funcionaba para mí y 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 funciona en este caso.
Lo que hay que hacer para ignorar un recurso externo faltante es:
ignore-resource-not-found="true"
Por si acaso alguien se topa con esto.
Si se asegura de que cada titular de lugar, en cada uno de los contextos involucrados, esté ignorando las claves no resueltas, entonces ambos 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>