IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

modifier un propertiesPlaceHolder a la volée..


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de progamer54
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut modifier un propertiesPlaceHolder a la volée..
    salut a tous;

    je bosse sur une application java utilisant Spring.
    J'ai un bean du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <bean id="propertyConfigurer"
         class="org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer">
       <constructor-arg ref="configurationEncryptor" />
       <property name="locations">
         <list>
           <value>application.properties</value>
         </list>
       </property>
     </bean>
    qui charge automatiquement les valeurs des données placée dans application.properties dans les beans ayant ce données comme propriété. Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <bean id="configController" 
      	class="fr.test.controllers.ConfigController">
      		<description>
      			bean qui récupère et vérifie le renseignements des paramètres obligatoires.
      		</description>
      <property name="urls" value="${ldap.urls}"/>
      <property name="ldapFilters" value="${ldap.filters}"/>
      <property name="xmlpath" value="${xml.creationPath}"/>
      <property name="xmlMapping" value="${xml.mapping}"/>
      </bean>
    et dans le application.properties je renseigne par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ldap.urls=ldap://ldap1.mon-ldap.fr:392
    Tout cela fonctionne. Cependant j'aimerai que les utilisateurs puissent si ils le désirent placer un autre fichier properties (voir plusieurs pour lancer autant de fois le traitement) en parametre du programme.
    J'aimerais donc pouvoir faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //récupération des beans:
    ApplicationContext ctx = new ClassPathXmlApplicationContext("springbeans.xml");
     
    if(args.length>0){
    	EncryptablePropertyPlaceholderConfigurer eppc = (EncryptablePropertyPlaceholderConfigurer)ctx.getBean("propertyConfigurer");
    	String fic_prop=args[0];
    	eppc.setLocation(new FileSystemResource(fic_prop));
     
    }
    Le probleme est que les proprietes sont chargées lors de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new ClassPathXmlApplicationContext("springbeans.xml");
    le changement que je fais apres n'est pas pris en compte.
    Y'a -t-il un moyen de recharger tous les beans utilisant les properties une fois le changement de fichier effectuer; un truc du genre : eppc.reloadAll();


    Merci d'avance pour votre aide

  2. #2
    Membre éclairé Avatar de progamer54
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut
    j'ai avancé un peu (enfin je pense) en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("springbeans.xml");
     
    			if(args.length>0){
    			EncryptablePropertyPlaceholderConfigurer eppc = (EncryptablePropertyPlaceholderConfigurer)ctx.getBean("propertyConfigurer");
    			String fic_prop=args[0];
    			eppc.setLocation(new FileSystemResource(fic_prop));
    			eppc.postProcessBeanFactory(ctx.getBeanFactory());
    je fais de passer le context en 'ConfigurableApplicationContext ' me permet de faire ctx.getBEanFactory, et du coup de faire 'postProcessBeanFactory'.

    à l'execution, j'ai bien une ligne m'indiquant qu'il charge le nouveau fchier properties:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Loading properties file from file [c:\application1.properties]
    en effet je lance l'appli en faisant : java monAppli c:/application1.properties


    le probleme est que le nouveau fichier de properties est bien pris en compte , mais les nouvelles valeurs ne sont pas injectées dans les beans, qui gradent les valeurs du premier fichier properties, celui indiqué dans le springbeans.xml...

  3. #3
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Hello,

    c'est tout à fait normal car un property place holder remplace les propriété au sein des fichier de configuration AVANT leurs lecture.

    Ordre:
    - chargement des fichier
    - remplacement des propriété sur base du property place holder
    - lecture des fichier
    - initialisation des beans

  4. #4
    Membre éclairé Avatar de progamer54
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut
    oui j'en suis conscient.
    mais y'a pas moyen de relancer une initialisation des beans une fois qu'il a lu mon nouveau fichier properties garce à ma ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    eppc.postProcessBeanFactory(ctx.getBeanFactory());
    meme si je dois le faire sur chaque bean qui utilise une property du fichier, par exemple en faisant un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ctx.getBeanFactory().reinstanciateBean("bean1");
    Je me dis que si la méthode postProcessBeanFactory existe c'est pour ce type d'utilisation...non?

  5. #5
    Membre éclairé Avatar de progamer54
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut
    D'ailleurs c'est bien indiqué ici:
    http://static.springframework.org/sp...bleBeanFactory)

    pour la méthode postProcessBeanFactory:

    "Modify the application context's internal bean factory after its standard initialization. All bean definitions will have been loaded, but no beans will have been instantiated yet. This allows for overriding or adding properties even to eager-initializing beans."

  6. #6
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Oui, c'est pour s'interfacer entre la lecture du fichier et l'initialisation des bean.

    Hors, le propertyPlaceHolder est avant la lecture du fichier comme je l'ai décrit!

Discussions similaires

  1. Modifier la collation à la volée
    Par guidav dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/04/2008, 18h41
  2. GridBagLayout: modifier les tailles a la volee
    Par MathiasM dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 18/01/2008, 10h18
  3. [CSS] modifier une classe à la volée, est-ce possible ?
    Par guidav dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/01/2007, 15h18
  4. [SVG] Modifier une image à la volée
    Par 18Marie dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 28/07/2006, 09h32
  5. Modifier un event à la volée
    Par MasterMic dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/07/2005, 13h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo