2009-03-26 12 views
50

Necesito cargar un archivo applicationContext.xml específico de acuerdo con una propiedad del sistema dada. Esto mismo carga un archivo con la configuración real. Por lo tanto, necesito 2 PropertyPlaceHolderConfigurer, uno que resuelve el parámetro del sistema y el otro dentro de la configuración real.¿Es posible tener múltiples PropertyPlaceHolderConfigurer en mi applicationContext?

¿Alguna idea de cómo hacer esto?

+0

Me pregunto si puede elaborar un poco más sobre el resultado final que está tratando de lograr. – krosenvold

Respuesta

71

Sí, puedes hacer más de una. Asegúrese de establecer ignoreUnresolvablePlaceholders para que el primero ignore cualquier marcador de posición que no pueda resolver.

<bean id="ppConfig1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    <property name="locations"> 
    <list> 
      <value>classpath*:/my.properties</value> 
    </list> 
    </property> 
</bean> 

<bean id="ppConfig2" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreUnresolvablePlaceholders" value="false"/> 
    <property name="locations"> 
    <list> 
      <value>classpath*:/myOther.properties</value> 
    </list> 
    </property> 
</bean> 

Dependiendo de la aplicación, se debe investigar systemPropertiesMode, que le permite cargar las propiedades de un archivo, pero permitir a las propiedades del sistema para anulan los valores en el archivo de propiedades si está establecido.

+5

vea la advertencia de trenton - (jira.springsource.org/browse/SPR-6428) - si las propiedades cargadas en el segundo PPC dependen de propiedades cargadas en el primer PPC, ¡no funcionará! – ihadanny

+0

¿Este fragmento de código está dentro de 'spring-servlet.xml' o' application-context.xml' ??? –

7

Cuidado: puede haber un error relacionado con varios configuradores. Vea http://jira.spring.io/browse/SPR-5719 para más detalles.

No puedo obtener múltiples para trabajar localmente ... pero todavía no estoy culpando a nadie más que a mí.

+2

a la derecha, consulte https://jira.springsource.org/browse/SPR-6428 - si las propiedades cargadas en el segundo PPC dependen de las propiedades cargadas en el primer PPC, ¡no funcionará! – ihadanny

+0

Me tropecé con otro error con Multiple PropertyPlaceholderConfigurer: https://jira.spring.io/browse/SPR-9989. Las anotaciones @Value ("$ {property: default}") solo usan el primer PPC, y si eso no proporciona la propiedad, se usa el valor predeterminado para. –

6

Otra solución es utilizar la propiedad placeholderPrefix de PropertyPlaceholderConfigurer. Usted lo especifica para el segundo (tercero, cuarto ...) configurador, y luego pone un prefijo a todos sus marcadores de posición correspondientes, por lo tanto no habrá conflicto.

<bean id="mySecondConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
     p:location="classpath:/myprops.properties" 
     p:placeholderPrefix="myprefix-"/> 

<bean class="com.mycompany.MyClass" p:myprop="${myprefix-value.from.myprops}"/> 
+2

gracias por la respuesta que ayudó. Solo una cosa: en mi caso, tuve que especificar un prefijo como '$ uploader {' y sufijo '}'. Así que obtengo propiedades usando $ uploader {key.from.file}. Su solución simplemente no obtuvo silenciosamente mis propiedades del archivo. – freakman

3

No se puede hacer esto directamente, y este tema JIRA partir de la primavera explica por qué (comprobar el comentario de Chris vigas para una explicación detallada):

https://jira.springsource.org/browse/SPR-6428

Sin embargo, él no proporcionan una solución con Spring 3.1 o posterior, que consiste en utilizar la clase PropertySourcesPlaceholderConfigurer en lugar de PropertyPlaceholderConfigurer.

se puede descargar un proyecto basado en Maven que muestra el problema y la solución de los problemas estructurales de Primavera de GitHub:

https://github.com/SpringSource/spring-framework-issues

Busque el número de emisión, SPR-6428, en los proyectos descargados.

0

tenemos el siguiente esquema de trabajo:

<util:properties id="defaultProperties"> 
    <prop key="stand.name">DEV</prop> 
    <prop key="host">localhost</prop> 
</util:properties> 
<context:property-placeholder 
    location="file:${app.properties.path:app.properties}" 
    properties-ref="defaultProperties"/> 

propiedad Sistema app.properties.path se pueden utilizar para anular ruta al archivo de configuración.

Y la aplicación incluye algunos valores predeterminados para marcadores de posición que no se pueden definir con los valores predeterminados en los módulos comunes.

2

En mi propio lado, jugando con PropertyPlaceholderConfigurer ambas propiedades:

  • fin (debe ser menor para la primera PPC visitada/analizado)
  • ignoreUnresolvablePlaceholders ("falso" para la primera visitada/PPC analizado " verdadero" para siguiente)

  • y también dar 2 id (s) distinta a ambos PPC (para evitar una para ser sobrescrito por el otro)

funciona perfectamente

creo que sirve

0

sólo dar 2 identificadores de distintos trabajaron para mí. Estoy usando la primavera 3.0.4.

Espero que ayude.

Cuestiones relacionadas