commandlinerunner batch application java spring web-applications jvm-arguments

java - batch - ¿Cómo leo los argumentos de JVM en Spring applicationContext.xml?



spring boot jvm arguments (6)

Tengo una aplicación web JSF con Spring y estoy tratando de encontrar una manera de hacer referencia a los argumentos JVM del applicationContext.xml. Estoy iniciando la JVM con un argumento de entorno (-Denv = desarrollo, por ejemplo). He encontrado y probado algunos enfoques diferentes, incluyendo:

<bean id="myBean" class="com.foo.bar.myClass"> <property name="environment"> <value>${environment}</value> </property> </bean>

Pero, cuando se invoca el método de establecimiento en MyClass, se pasa la cadena "$ {environment}", en lugar de "desarrollo". Tengo un trabajo alrededor para usar System.getProperty (), pero sería mejor y más limpio poder establecer estos valores a través de Spring. ¿Hay alguna manera de hacer esto?

Edición: Lo que debería haber mencionado antes es que estoy cargando propiedades de mi base de datos utilizando una conexión JDBC. Esto parece agregar complejidad, porque cuando agrego un marcador de posición de propiedad a mi configuración, el marcador de posición de propiedad invalida las propiedades cargadas de la base de datos. No estoy seguro de si es dependiente de la orden o algo así. Es como que puedo hacer una o la otra, pero no ambas.

Editar: Actualmente estoy cargando las propiedades usando la siguiente configuración:

<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="jdbc.mydb.myschema"/> </bean> <bean id="props" class="com.foo.bar.JdbcPropertiesFactoryBean"> <property name="jdbcTemplate"> <bean class="org.springframework.jdbc.core.JdbcTemplate"> <constructor-arg ref="myDataSource" /> </bean> </property> </bean> <context:property-placeholder properties-ref="props" />


Curiosamente, Spring ha evolucionado para manejar esta necesidad con más gracia con PropertySources: http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/

Con unas pocas configuraciones y quizás un ApplicationInitializer personalizado si está trabajando en una aplicación web, puede hacer que el marcador de posición de propiedad maneje el sistema, el entorno y las propiedades personalizadas. Spring proporciona PropertySourcesPlaceholderConfigurer que se usa cuando tiene en su configuración de Spring. Ese buscará las propiedades en sus archivos de propiedades, luego Sistema y finalmente Ambiente.


Primavera 3.0.7

<context:property-placeholder location="classpath:${env:config-prd.properties}" />

Y en el tiempo de ejecución establecido: -Denv = config-dev.properties

Si no se configura, "env" usará por defecto "config-prd.properties".


Puede cargar un archivo de propiedades basado en la propiedad del sistema env esta manera:

<bean id="applicationProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreResourceNotFound" value="false" /> <property name="ignoreUnresolvablePlaceholders" value="true" /> <property name="searchSystemEnvironment" value="false" /> <property name="locations"> <list> <value>classpath:myapp-${env:prod}.properties</value> </list> </property> </bean>

Si env no se configura de forma predeterminada para la producción, de lo contrario, los equipos de desarrollo y prueba pueden tener su sabor de aplicación configurando -Denv=development o -Denv=testing consecuencia.


Puedes usar las expresiones Spring EL, entonces es #{systemProperties.test} para -Dtest="hallo welt"

En tu caso debería ser:

<bean id="myBean" class="com.foo.bar.myClass"> <property name="environment"> <value>#{systemProperties.environment}</value> </property> </bean>

El # lugar de $ no es ningún error!

$ se referiría a los titulares de posición, mientras que # refiere a beans, y systemProperties es un bean.

Puede que solo sea un error ortográfico, pero puede ser la causa de su problema: en el ejemplo de su instrucción de línea de comandos, usted nombra la variable env

( -Denv=development , por ejemplo ...

Pero en la configuración de primavera lo llamas environment . ¡Pero ambos deben ser iguales por supuesto!


Si registra un PropertyPlaceholderConfigurer, utilizará las propiedades del sistema como una alternativa.

Por ejemplo, agregar

<context:property-placeholder/>

a su configuracion Luego puede usar ${environment} en su configuración XML o en @Value anotaciones de @Value .


Utilice # {systemProperties [''env'']} Básicamente, pase el propertyName utilizado en la línea de comandos de Java como -DpropertyName = valor. En este caso fue -Denv = el desarrollo se usó como env.