PropertyPlaceholderConfigurer читает из XML-файла (конфигурация Apache Commons) - PullRequest
4 голосов
/ 02 июля 2010

Есть ли возможность настроить Spring PropertyPlaceholderConfigurer для чтения из properties.xml через конфигурацию Apache Commons?

Ответы [ 3 ]

3 голосов
/ 06 июля 2010

Я нашел решение с помощью seanizer и 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>

класса 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 довольно старый и кажется, что он больше не поддерживается, но работает с Spring 3.0.3.

не стесняйтесь копировать и вставлять!

2 голосов
/ 02 июля 2010

Самый простой способ (хотя, может быть, и не самый лучший) заключался бы в создании подкласса PropertyPlaceholdeConfigurer, загрузке конфигурации общих ресурсов и последующей передаче его суперклассу:

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

Тогда вы просто используете этот класс как placeholderConfig:

<bean id="placeholderConfig"
    class="com.exampl.TestPlaceholderConfigurer ">
    <!-- ... -->
</bean>
1 голос
/ 02 июля 2010

Вот решение с использованием пружинных модулей .Я не знаю, насколько это актуально, но даже если это не так, вы, вероятно, могли бы легко взять код и заставить его работать с текущими версиями.

...