2011-04-08 12 views
20

Tengo una aplicación web JSF con Spring y estoy tratando de encontrar una manera de hacer referencia a los argumentos de JVM desde applicationContext.xml. Estoy comenzando la JVM con un argumento de entorno (-Denv = desarrollo, por ejemplo). He descubierto y tratado algunos enfoques diferentes, incluyendo:Cómo leo los argumentos de JVM en Spring applicationContext.xml

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

Pero, cuando el método de selección es invocada en MiClase, la cadena "$ {entorno}" se pasa, en lugar de "desarrollo". Tengo un trabajo inmejorable 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?

Edit: Lo que debería haber mencionado antes es que estoy cargando propiedades de mi base de datos usando una conexión JDBC. Esto parece agregar complejidad, porque cuando agrego un marcador de posición de propiedad a mi configuración, las propiedades cargadas de la base de datos son anuladas por el marcador de posición de propiedad. No estoy seguro de si depende del pedido o algo así. Es como si pudiera hacer uno u otro, pero no ambos.

Editar: Actualmente estoy cargando las propiedades utilizando 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" /> 

Respuesta

26

Se pueden utilizar expresiones Primavera EL, entonces es #{systemProperties.test} para -Dtest="hallo welt"

En su caso, debería ser:

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

El # en lugar de $ no es un error!

$ haría referencia a marcadores de posición, mientras que # se refiere a los granos, y systemProperties es un bean.


Mayo es sólo un error de ortografía, pero puede que es la causa de su problema: En el ejemplo de su estado de línea de comandos que un nombre a la variable de env

(-Denv=development, por ejemplo. ..

Pero en la configuración de la primavera lo que sea environment. Pero ambos deben ser iguales, por supuesto!

+0

Obtengo el mismo resultado utilizando este enfoque que con el método de mi ejemplo. La cadena, "# {systemProperties.environment}" es lo que pasa al método setter. – jinxed

+0

@jinxed: Creo que he encontrado el último problema, hubo un error ortográfico. - mira mi respuesta extendida. – Ralph

10

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

Por ejemplo, agregue

<context:property-placeholder/> 

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

+0

Cuando agrego esto a la configuración, las propiedades que cargo desde la base de datos quedan anuladas por este marcador de posición de propiedad. Edición de la descripción original. – jinxed

+0

¿Cómo se cargan las propiedades de la base de datos? ¿Son parte de la configuración de PropertyPlaceholderConfigurer? – sourcedelica

+0

Se cargan a través de JDBC utilizando la configuración que se muestra en la pregunta (arriba) ... – jinxed

3

Se puede cargar un archivo de propiedades basado en la propiedad del sistema env así:

<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 está configurado por defecto para la producción de otra forma el desarrollo y equipos de prueba pueden tener su sabor de aplicación mediante el establecimiento de -Denv=development o -Denv=testing en consecuencia.

+0

Lee el hilo de nuevo. Las propiedades se están cargando desde el DB. La pregunta es, ¿cómo uso los argumentos de JVM en otra parte de la configuración? – jinxed

+0

Esto es lo que veo en su pregunta: 'Estoy comenzando la JVM con un argumento de entorno (-Denv = desarrollo, por ejemplo)' También noté en su pregunta editada que usted mencionó que también está leyendo algunas propiedades de DB. ¿Existe alguna restricción de que las propiedades se puedan leer desde SOLAMENTE 1 fuente? – anubhava

+0

Todas las propiedades se cargan desde la base de datos. Entiendo el concepto de usar PropertyPlaceholderConfigurer para extraer los argumentos de JVM, pero cuando uso PropertyPlaceholderConfigurer, las propiedades de DB que se cargaron correctamente ahora faltan. – jinxed

0

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

Con algunas configuraciones y tal vez un ApplicationInitializer encargo si está trabajando en una aplicación Web, puede hacer que el sistema de mango marcador de posición propiedad , Medio ambiente y propiedades personalizadas. Spring proporciona PropertySourcesPlaceholderConfigurer que se usa cuando tienes en tu configuración de Spring. Ese buscará propiedades en sus archivos de propiedades, luego Sistema, y ​​finalmente Medio Ambiente.

0

primavera 3.0.7

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

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

si no se establece "env" utilizará "config-prd.properties" por defecto.

1

Use #{systemProperties['env']} Básicamente pase el propertyName utilizado en la línea de comandos de Java como -DpropertyName=value. En este caso, fue -Denv=development, así que se utilizó env.

Cuestiones relacionadas