2010-07-02 10 views
4

Y at-il une possibilité de configurer le Spring PropertyPlaceholderConfigurer pour lire à partir de properties.xml, via Apache Commons Configuration?PropertyPlaceholderConfigurer lit à partir du fichier XML (Configuration d'Apache Commons)

+0

duplication possible de [Existe-t-il une classe de type PropertyPlaceholderConfigurer à utiliser avec Spring qui accepte XML?] (Http://stackoverflow.com/questions/479855/is-there-a-propertyplaceholderconfigurer-like-class-for- use-with-spring-that-acce) – GaryF

Répondre

3

J'ai trouvé une solution avec l'aide de seanizer et springmodule

<!-- Composite configuration --> 
<bean id="configuration" class="org.springmodules.commons.configuration.CommonsConfigurationFactoryBean"> 
    <property name="configurations"> 
     <list> 
      <!-- User specifics --> 
      <bean class="org.apache.commons.configuration.XMLConfiguration"> 
       <constructor-arg type="java.net.URL" value="file:cfg.xml" /> 
      </bean> 
     </list> 
    </property> 
</bean> 

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="properties" ref="configuration"/> 
</bean> 

<bean id="testConfig" class="uvst.cfg.TestConfiguration"> 
    <property name="domain" value="${some.prop}"></property> 
</bean> 

classe TestConfiguration

public class TestConfiguration { 
    private String domain; 
    public String getDomain() { 
     return domain; 
    } 
    public void setDomain(String domain) { 
     this.domain = domain; 
    } 
} 

jUnit TestClass

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({ "/applicationContextTest.xml" }) 

public class ApacheCommonCfg2Spring extends AbstractJUnit4SpringContextTests { 

    private TestConfiguration tcfg; 

    @Test 
    public void configuration(){ 
     tcfg = this.applicationContext.getBean("testConfig", TestConfiguration.class); 
     System.out.println(tcfg.getDomain()); 
    } 

} 

Springmodule est assez vieux d'il semble que ce soit pas plus longtemps, mais cela fonctionne avec S pring 3.0.3.

n'hésitez pas à copier & pâte!

2

La façon la plus simple (peut-être pas la plus belle que) serait de sous-classe la PropertyPlaceholdeConfigurer, chargez là-bas et passe ensuite la configuration des communes à la superclasse:

public class TestPlaceholderConfigurer extends PropertyPlaceholderConfigurer 
{ 
    public TestPlaceholderConfigurer() 
    { 
     super(); 
    } 

    @Override 
    protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) 
      throws BeansException 
    { 
     XMLConfiguration config = new XMLConfiguration("config.xml"); 
     Properties commonsProperties = config.getProperties("someKey") 
     // Or something else with the configuration 
     super.processProperties(beanFactoryToProcess, commonsProperties); 
    } 
} 

Ensuite, vous utilisez juste cette classe comme placeholderConfig :

<bean id="placeholderConfig" 
    class="com.exampl.TestPlaceholderConfigurer "> 
    <!-- ... --> 
</bean> 
+0

Cela ne fonctionne pas. – Alex

+3

Peut-être que vous pouvez élaborer sur "Cela ne fonctionne pas". Après tout, Daff a fait des efforts pour essayer de répondre à votre question. –

+1

C'est vrai, ce n'était pas censé être une copie de copier/coller (ce que je dois supposer que vous avez fait concernant votre réponse inutile et une mise au rancart non commentée). Comme d'habitude avec des réponses ici, c'est juste un guide sur la façon de résoudre votre problème, si vous avez une question spécifique juste postez-le comme une réponse. – Daff

1

Voici un solution using spring modules. Je ne sais pas à quel point c'est actuel, mais même si ce n'est pas le cas, vous pourriez facilement prendre le code et le faire fonctionner avec les versions actuelles.