2009-08-21 17 views
12

Necesito cargar algunas propiedades en un contexto Spring desde una ubicación que no conozco hasta que se ejecuta el programa.ubicación de marcador de propiedad de otra propiedad

Así que pensé que si tuviera un PropertyPlaceholderConfigurer con ninguna ubicación se leería en my.location de las propiedades del sistema y luego podría utilizar ese lugar en un contexto: la propiedad-marcador de posición

gusta esta

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>  
<context:property-placeholder location="${my.location}"/> 

pero esto no funciona y tampoco lo hace location="classpath:${my.location}"

Paul

+0

No podrá combinar dos marcadores de posición como ese: son BeanFactoryPostProcessors, que no pueden procesarse entre sí, si entiende lo que quiero decir. – skaffman

+0

sí, pensé que mi problema era algo así como –

+0

En realidad, esto huele como una mejora de PropertyPlaceHolderConfigurer que podría valer la pena presentar como una solicitud de función en Spring JIRA. – skaffman

Respuesta

5

El problema aquí es que está intentando configurar un titular de posición de propiedad utilizando la sintaxis del marcador de posición de propiedad :) Es un poco de una situación de gallina y huevo: la primavera no puede resolver su marcador de posición ${my.location} hasta que se configure el marcador de posición de propiedad.

Esto no es satisfactoria, pero se podía bodge mediante el uso de la sintaxis más explícito:

<bean class="org.springframework.beans.factory.config.PropertyPlaceHolderConfigurer"> 
    <property name="location"> 
     <bean class="java.lang.System" factory-method="getenv"> 
     <constructor-arg value="my.location"/> 
     </bean> 
    </property> 
</bean> 
+0

no es satisfactorio, pero al menos podría funcionar –

+0

No funciona para mí usando Spring 3.1.3: 'org.springframework.beans.NotWritablePropertyException: Propiedad no válida 'ubicación' de la clase bean [org.springframework.beans.factory.config .PropertyPlaceholderConfigurer]: la "ubicación" de la propiedad Bean no se puede escribir o tiene un método setter no válido. ¿El tipo de parámetro del setter coincide con el tipo de retorno del getter? ' –

15

Usted puede hacer esto con un enfoque ligeramente diferente. Así es como lo configuramos. Cargué las propiedades predeterminadas y luego las anulé con propiedades desde una ubicación configurable. Este trabajo es muy bueno para mi.

<bean id="propertyPlaceholderConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
     <property name="locations"> 
      <list> 
       <value>classpath:site/properties/default/placeholder.properties 
       </value> 
       <value>classpath:site/properties/${env.name}/placeholder.properties 
       </value> 
      </list> 
     </property> 
    </bean> 
+0

+1 - Lo he hecho. Funciona bien. –

Cuestiones relacionadas