2015-03-19 79 views
6

目前我有一個加載屬性文件的Spring xml配置(Spring 4)。Spring佔位符不能解析JavaConfig中的屬性

context.properties

my.app.service = myService 
my.app.other = ${my.app.service}/sample 

Spring XML配置

<bean id="contextProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="fileEncoding" value="UTF-8" /> 
    <property name="locations"> 
     <list> 
      <value>classpath:context.properties</value> 
     </list> 
    </property> 
</bean> 
<bean id="placeholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="properties" ref="contextProperties" /> 
    <property name="nullValue" value="@null" /> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
</bean> 

Bean上使用屬性

@Component 
public class MyComponent { 

    @Value("${my.app.other}") 
    private String others; 

} 

這工作完全和othersMyService/sample,爲例外。但是當我嘗試用JavaConfig替換此配置時,我的組件中的@Value不能以相同的方式工作。該值不是myService/sample而是${my.app.service}/sample

@Configuration 
@PropertySource(name="contextProperties", ignoreResourceNotFound=true, value={"classpath:context.properties"}) 
public class PropertiesConfiguration { 

    @Bean 
    public static PropertyPlaceholderConfigurer placeholder() throws IOException { 
     PropertyPlaceholderConfigurer placeholder = new PropertyPlaceholderConfigurer(); 
     placeholder.setNullValue("@null"); 
     placeholder.setSystemPropertiesMode(PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE); 
     return placeholder; 
    } 

} 

我是否錯過了從xml到Javaconfig的轉換?

ps:我也嘗試實例化一個PropertySourcesPlaceholderConfigurer而不是PropertyPlaceholderConfigurer沒有更多的成功。

+0

即使它不能解決你的問題,我可以確認你應該使用'PropertySourcesPlaceholderConfigurer',而不是'PropertyPlaceholderConfigurer' – superbob 2015-03-19 09:49:13

+0

'my.app.service'屬性解決好嗎?使用@Value(「$ {my.app.service}」)檢查,如果問題來自屬性嵌套,我會漫步。 – superbob 2015-03-19 09:53:00

回答

2

更新使用配置PropertySourcesPlaceholderConfigurer。只要有@PropertySource註釋是不夠的:

@Bean 
public static PropertySourcesPlaceholderConfigurer properties() { 
    return new PropertySourcesPlaceholderConfigurer(); 
} 

@PropertySource註釋不會自動註冊和春天有個PropertySourcesPlaceholderConfigurer。因此,我們需要明確配置PropertySourcesPlaceholderConfigurer

下面JIRA票對這種設計背後的基本原理的更多信息:

https://jira.spring.io/browse/SPR-8539

UPDATE: 創建簡單的Spring啓動應用程序使用嵌套的屬性。它與上述配置工作正常。

https://github.com/mgooty/property-configurer/tree/master/complete

+0

更新了答案 – Mithun 2015-03-19 10:21:03

+0

我認爲OP已經做到了,並且沒有奏效,在問題中看到了他的'ps'。我徘徊,如果問題似乎與屬性嵌套('my.app.other = $ {my.app.service}/sample') – superbob 2015-03-19 10:40:04

1

另一種方法是導入PropertyPlaceholderAutoConfiguration.class。

import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; 

@Import(PropertyPlaceholderAutoConfiguration.class) 

註釋在上下文中包含一個PropertySourcesPlaceholderConfigurer(如果它不存在)。

+0

是的,這適用於基於** spring-boot **的上下文。 – 2016-10-31 11:18:04

相關問題