PropertyPlaceholderConfigurer reads from XML File (Apache Commons Configuration)

后端 未结 3 1603
忘了有多久
忘了有多久 2021-02-10 18:51

Is there a possibility to configure the Spring PropertyPlaceholderConfigurer to read from properties.xml, via Apache Commons Configuration?

相关标签:
3条回答
  • 2021-02-10 19:13

    Here is a solution using spring modules. I don't know how current this is, but even if it isn't you could probably easily take the code and make it work with current versions.

    0 讨论(0)
  • 2021-02-10 19:21

    I found a solution with the help of seanizer and 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>
    

    class 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 is rather old an it seems that it is not longer maintained, but it works with Spring 3.0.3.

    feel free to copy & paste!

    0 讨论(0)
  • 2021-02-10 19:27

    The easiest way (maybe not the nicest though) would be to subclass the PropertyPlaceholdeConfigurer, load the commons configuration there and then pass it to the superclass:

    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);
        }
    }
    

    Then you just use this class as the placeholderConfig:

    <bean id="placeholderConfig"
        class="com.exampl.TestPlaceholderConfigurer ">
        <!-- ... -->
    </bean>
    
    0 讨论(0)
提交回复
热议问题