web-dev-qa-db-fra.com

Comment lire les arguments de la machine virtuelle Java dans le fichier applicationContext.xml de Spring

J'ai une application Web JSF avec Spring et j'essaie de trouver un moyen de référencer les arguments de la machine virtuelle Java à partir du fichier applicationContext.xml. Je démarre la machine virtuelle avec un argument d'environnement (-Denv = développement, par exemple). J'ai trouvé et essayé différentes approches, notamment:

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

Mais, lorsque la méthode setter est appelée dans MyClass, la chaîne "$ {environment}" est transmise au lieu de "développement". J'ai un moyen de contourner l'utilisation de System.getProperty (), mais il serait plus agréable et plus propre de pouvoir définir ces valeurs via Spring. Y a-t-il un moyen de faire ça?

Edit: Ce que j’aurais dû mentionner auparavant, c’est que je charge les propriétés de ma base de données à l’aide d’une connexion JDBC. Cela semble ajouter à la complexité, car lorsque j'ajoute un espace réservé de propriété à ma configuration, les propriétés chargées à partir de la base de données sont remplacées par cet espace réservé. Je ne suis pas sûr que cela dépende de l'ordre ou de quelque chose. C'est comme si je pouvais faire l'un ou l'autre, mais pas les deux.

Edit: Je charge actuellement les propriétés en utilisant la configuration suivante:

<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" />
20
jinxed

Vous pouvez utiliser des expressions Spring EL, il s'agit alors de #{systemProperties.test} pour -Dtest="hallo welt"

Dans votre cas, cela devrait être:

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

Le # au lieu de $ n'est pas une erreur!

$ ferait référence aux espaces réservés, alors que # ferait référence aux beans, et systemProperties serait un bean.


Peut-être qu’il s’agisse seulement d’une faute d’orthographe, mais aussi de la cause de votre problème: dans l’exemple de votre instruction de ligne de commande, nommez la variable env 

(-Denv=development, par exemple ...

Mais dans la configuration de printemps, vous l’appelez environment. Mais les deux doivent être égaux bien sûr! 

27
Ralph

Si vous enregistrez un PropertyPlaceholderConfigurer, il utilisera les propriétés système comme solution de secours.

Par exemple, ajoutez

<context:property-placeholder/>

à votre configuration. Ensuite, vous pouvez utiliser ${environment} dans votre configuration XML ou dans les annotations @Value.

10
sourcedelica

Vous pouvez charger un fichier de propriétés basé sur la propriété système env comme ceci:

   <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 n'est pas défini, mettez la production par défaut. Dans le cas contraire, les équipes de développement et de test peuvent avoir leur propre app en définissant -Denv=development ou -Denv=testing en conséquence.

3
anubhava

Utilisez # {systemProperties ['env']} En règle générale, transmettez le propertyName utilisé dans la ligne de commande Java sous la forme -DpropertyName = value. Dans ce cas, il s'agissait de -Denv = development ainsi utilisé env.

1
Amit M

Printemps 3.0.7

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

Et à l'exécution définie: - Denv = config-dev.properties

Si non défini, "env" utilisera par défaut "config-prd.properties".

0
disciolli

Il est intéressant de noter que Spring a évolué pour gérer ce besoin de manière plus harmonieuse avec PropertySources: http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/

Avec quelques configurations et peut-être un ApplicationInitializer personnalisé si vous travaillez sur une application Web, vous pouvez avoir un espace réservé de propriété qui gère les propriétés système, d'environnement et personnalisées. Spring fournit PropertySourcesPlaceholderConfigurer qui est utilisé lorsque vous avez dans votre configuration Spring. Celui-ci recherchera les propriétés dans vos fichiers de propriétés, puis Système, et enfin Environnement. 

0
Chris J