2015-03-19 3 views
6

В настоящее время у меня есть конфигурация Spring xml (весна 4), которая загружает файл свойств.Spring placeholder не разрешает свойства в 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; 

} 

Это прекрасно работает и значение others является MyService/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

+0

. Разрешено ли свойство 'my.app.service'? Проверьте с помощью '@Value (" $ {my.app.service} ")', я блуждаю, если проблема возникает из вложенности свойств. – superbob

ответ

2

Обновление для использования configure 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

+0

Я думаю, что ОП уже сделал это, и это не сработало, см. Его «ps» в вопросе. Я блуждаю, если проблема, похоже, связана с вложением свойств ('my.app.other = $ {my.app.service}/sample') – superbob

1

Другим вариантом является импорт PropertyPlaceholderAutoConfiguration.class.

import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; 

@Import(PropertyPlaceholderAutoConfiguration.class) 

аннотаций включает в себя PropertySourcesPlaceholderConfigurer в контексте, если он не существует.

+0

Да, это работает в контексте ** spring-boot **. –