13

Tengo un Spring application-context.xml con PropertyPlaceholderConfigurer para obtener los valores de las propiedades del archivo .properties. Las carpetas de origen principal y de prueba tienen un archivo .properties por separado. El problema es que necesito usar variables de entorno en el archivo .properties. Pero cuando lo hago de la siguiente manera:PropertyPlaceholderConfigurer y variables de entorno en archivos .properties

property.name=${env.SYSTEM_PROPERTY} 

Estoy recibiendo el siguiente error:

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'beanName' defined in class path resource [com/example/applicationContext.xml]: Could not resolve placeholder 'env.SYSTEM_PROPERTY' 

mientras configurador marcador de posición define como

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:com/example/application.properties"/> 
</bean> 

Alguna idea de cómo-hacer property.name se interpreta como variable de entorno (y no como marcador de posición)?

Recuerdos, Dmitriy.

Respuesta

23

probablemente me cambio la solución completamente: inyecto la propiedad del sistema directamente, en contraposición a la inyección de la propiedad que se refiere a una propiedad del sistema

P. ej

@Value("#{ systemProperties['JAVA_MY_ENV'] }") 
private String myVar; 

o

<property name ="myVar" value="#{systemProperties['JAVA_MY_ENV']}"/> 

Puedo usar un configurador marcador de posición propiedad como esta

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
    <list> 
     <value>classpath:someprops.properties</value> 
    </list> 
    </property> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="searchSystemEnvironment" value="true" /> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 

También hay que recordar a pasar el parámetro en el programa usando

-DJAVA_MY_ENV=xyz 

Este camino cuando tu ejecuta la versión de producción, puedes pasar una cosa y cuando estás ejecutando prueba otra.

también lo que a menudo lo que hago es algo como esto:

<property name="locations"> 
    <list> 
     <value>classpath:someprops.properties</value> 
     <value>classpath:someprops-{environment}.properties</value> 
    </list> 
    </property> 

donde el medio ambiente es prod/fase/test/int/CI/local (1 por medio ambiente - es posible que sólo tienen 2 o 3 para ahora). Puede pasar la variable de entorno al programa. Cualquier propiedad que debería ser igual independientemente de si su producción/ejecución en su PC/prueba local estaría en el archivo de propiedades someprops.properties. Cualquiera específico para el entorno/forma en que se ejecuta, irá en el archivo más específico (debe colocarlo en el archivo someprops.properties así como en un valor predeterminado a menos que se invalide el mecanismo)

E.g. en la ruta de clase: someprops.properties

url=www.mysite.com 

en la ruta de clase: someprops-local.properties

url=localhost 

Mediante el uso de esta idea básica se puede separar las pruebas y las propiedades de marcha normal del programa de una manera limpia.

+0

Esto es bastante buena. Sin embargo, un problema es que olvidando definir una variable de tiempo de ejecución produce errores de tiempo de ejecución difíciles, como el archivo config_xxx no encontrado y los "me gusta". Para mejorar esa situación, registro un bean que implementa interfaces especiales de primavera como esta: class EnvironmentReporter implementa PriorityOrdered, BeanFactoryPostProcessor, EnvironmentAware {...} environment.getProperty me permite comprobar las propiedades esperadas y falla limpiamente antes de que se obtenga cualquier otro bean creado. – Federico

7

Usando:

<context:property-placeholder location="classpath:env.properties"/> 

Cambiar la:

property.name=${env.SYSTEM_PROPERTY} 

Para:

property.name=${SYSTEM_PROPERTY} 

estoy usando primavera 3.0.4.RELEASE, pero no tengo ni idea cuando este Fue presentado.

+1

Muchas gracias. Resolví el problema al utilizar la clase auxiliar que busca la propiedad de VM, luego la variable de entorno y luego utiliza el valor predeterminado. En este momento es una forma más flexible para mí. Pero aún así, gracias, intentaré hacerlo la próxima vez. –

+1

extraño - usando el resorte 3.0.4, esto no parece funcionar –

0

que utiliza el enfoque de benkiefer, pero tenía que añadir un detector de web.xml:

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
Cuestiones relacionadas