21 votes

Comment lire les arguments JVM dans le fichier applicationContext.xml de Spring

J'ai une application web JSF avec Spring et j'essaie de trouver un moyen de faire référence aux arguments JVM à partir du applicationContext.xml. Je démarre le JVM avec un argument d'environnement (-Denv=développement, par exemple). J'ai trouvé et essayé quelques approches différentes, notamment:

    ${environment}

Mais, lorsque la méthode setter est invoquée dans MyClass, la chaîne "${environment}" est passée, au lieu de "développement". J'ai une solution de contournement en place pour utiliser System.getProperty(), mais il serait plus agréable et plus propre de pouvoir définir ces valeurs via Spring. Est-ce possible de le faire?

Éditer: Ce que j'aurais dû mentionner auparavant, c'est que je charge des propriétés de ma base de données en utilisant une connexion JDBC. Cela semble ajouter de la complexité, car lorsque j'ajoute un espace réservé pour les propriétés à ma configuration, les propriétés chargées à partir de la base de données sont écrasées par l'espace réservé pour les propriétés. Je ne suis pas sûr si c'est dépendant de l'ordre ou quelque chose comme ça. C'est comme si je pouvais faire l'un ou l'autre, mais pas les deux.

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

27voto

Ralph Points 42744

Vous pouvez utiliser des expressions Spring EL, alors c'est #{systemProperties.test} pour -Dtest="hallo welt"

Dans votre cas, cela devrait être :

    #{systemProperties.environment}

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

$ ferait référence aux espaces réservés, tandis que # fait référence aux beans, et systemProperties est un bean.


Peut-être s'agit-il simplement d'une faute de frappe, mais peut-être est-ce la cause de votre problème : dans l'exemple de votre déclaration en ligne de commande, vous nommez la variable env

(-Denv=development, par exemple...

Mais dans la configuration spring, vous la nommez environment. Mais les deux doivent bien sûr être égaux !

10voto

sourcedelica Points 12533

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

Par exemple, ajoutez

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

4voto

anubhava Points 172509

Vous pouvez charger un fichier de propriétés basé sur la propriété système env de cette manière :

            classpath:myapp-${env:prod}.properties

Si env n'est pas défini, définissez-le par défaut sur production sinon les équipes de développement et de test peuvent avoir leur propre version de l'application en définissant -Denv=development ou -Denv=testing en conséquence.

1voto

Amit M Points 46

Utilisez #{systemProperties['env']}. Passez essentiellement le nom de la propriété utilisée dans la ligne de commande Java en tant que -DpropertyName=value. Dans ce cas, c'était -Denv=développement donc utilisez env.

0voto

Chris J Points 3923

Intéressant, Spring a évolué pour gérer ce besoin de manière plus élégante 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 faire en sorte que le gestionnaire de propriétés gère les propriétés System, Environment et personnalisées. Spring fournit PropertySourcesPlaceholderConfigurer qui est utilisé lorsque vous avez <context:property-placeholder> dans votre configuration Spring. Celui-ci cherchera les propriétés dans vos fichiers de propriétés, ensuite dans System, et enfin dans Environment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X