java spring properties

java - MĂșltiples archivos de propiedades en Spring 3.0



properties (3)

El siguiente fragmento de código debería ayudarte a comenzar

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="corePlaceHolder"> <property name="ignoreUnresolvablePlaceholders" value="true"/> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> <property name="searchSystemEnvironment" value="true"/> <property name="locations"> <list> <value>classpath*:config/*/config1/*.properties</value> <value>classpath*:config/*/config2/*.properties</value> <value>classpath*:config/*/config3/*.properties</value> <value>classpath*:custom.properties</value> </list> </property> </bean>

Puede almacenar los archivos de propiedades en la siguiente jerarquía asegurándose de que se pueda acceder a la configuración a través de classpath

config config1 a.properties config2 b.properties config3 c.properties custom.properties

Estoy trabajando en un proyecto con varios módulos separados, cada uno con sus propios archivos de propiedades de contexto de aplicación. Quiero poder cargar todas estas propiedades para que Spring pueda utilizarlas para la resolución de marcadores de posición.

Las preguntas anteriores han mencionado esto y hay una buena publicación de blog here que describe cómo usar un PropertyPlaceholderConfigurer en cada contexto, ordénelos por prioridad y establezca ignoreUnresolveablePlaceholders en true para que estos archivos de propiedades puedan realizar referencias cruzadas entre sí sin explotar.

Sin embargo, esto no resuelve mi problema ya que también quiero poder usar las propiedades que estoy cargando para una resolución de marcador de posición personalizada (de algunos archivos yaml que estoy analizando). Esto requiere usar un PropertyPlaceholderHelper, que requiere que el objeto Propiedades sea un argumento.

Por lo que sé, las posibles soluciones son:

1) Combinar todo el archivo de propiedades en un bean de propiedades. Esto se puede usar para crear un PropertyPlaceholderConfigurer (para la resolución interna de marcador de posición de Spring) y se puede usar con un PropertyPlaceholderHelper (para mi propia resolución de marcador de posición)

2) De alguna manera configure un PropertyPlaceholderHelper para usar el conjunto de propiedades, y su disposición jerárquica, que tienen los PropertyPlaceholderConfigurers si continúo y sigo los consejos de esa publicación del blog.

Lamentablemente no puedo averiguar cómo hacer cualquiera de estos. Cualquier ayuda sería muy apreciada!

PD: Parece que la primavera 3.1 será de gran ayuda aquí ... desafortunadamente, aún no estamos listos para seguir adelante, así que todavía necesito una solución para ayudarme.

**** EDITAR ****

Gracias por las respuestas hasta ahora. Son buenas respuestas, pero lamentablemente no me ayudarán porque (y disculpas por no mencionar esto antes), actualmente estamos en el proceso de separar los módulos principales de nuestro proyecto de los módulos no básicos. Esto significa que los módulos básicos, y su contexto de aplicación, no pueden codificar los nombres de los archivos de propiedades. De manera frustrante, el escaneo de classpath de Spring parece estar roto, por lo que los comodines del tipo "classpath *: *. Properties" solo funcionan cuando se construyen los módulos individuales, no el proyecto de nivel superior (creo que este es un problema conocido).

La pregunta es cómo fusionar los archivos de propiedades definidos en módulos no centrales en los archivos de propiedades existentes definidos en los módulos principales. En este momento estoy avanzando con un BeanPostProcessor. ¿Me pregunto si hay una forma más simple / elegante de hacer esto?

Gracias


Esto es todo lo que necesitas hacer:

<context:property-placeholder location="first.properties" order="0" ignore-unresolvable="true"/> <context:property-placeholder location="second.properties" order="0" ignore-unresolvable="true"/> <context:property-placeholder location="empty.properties" order="1"/>

El problema es simple: si un marcador de posición de propiedad no tiene valor para una propiedad determinada, lanzará una excepción, aunque haya otro marcador de posición de propiedad presente.

La solución utiliza el order para saber cuál es el último property-placeholder y establece ignore-unresolvable="true" en todos los demás, de modo que cada property-placeholder tenga la oportunidad de proporcionar un valor. En proyectos de múltiples módulos, el último property-placeholder podría estar vacío o proporcionar valores predeterminados a prueba de fallas.

Nota: si configura todos los marcadores de posición de propiedad en ignore-unresolvable="true" Spring solo pasará lo que escribió sin lanzar una excepción. Si, por supuesto, espera que sea algo diferente a la String , seguramente obtendrá una ecepción como java.lang.NumberFormatException: For input string: "${something}" durante la conversión de formato.

Nota: solo se utilizará el primer property-placeholder (uno con el order más bajo) con un valor para la propiedad específica. Si desea anular propiedades, utilice un rango de order mayor que 0 y 1 o property-override .

Probado con Spring 3.2.1, pero todas las propiedades mencionadas existen en 3.0. Ver JavaDoc de PropertyPlaceholderConfigurer


Puede recopilar múltiples archivos de propiedades en un bean con bastante facilidad:

<bean id="allProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="singleton" value="true"/> <property name="ignoreResourceNotFound" value="true"/> <property name="locations"> <list> <value>classpath*:default.properties</value> <value>classpath*:overrides.properties</value> <value>file:${APP_HOME}/**/*.properties</value> </list> </property> </bean>

Este ejemplo en particular recopilará todos los archivos default.properties, overrides.properties en classpath y los archivos de propiedades en su APP_HOME. Ahora puede consultar este bean desde ProperyPlaceholderConfigurer o su postprocesador personalizado.