2013-11-28 3 views
0

У меня есть существующая конфигурация пружины XML на основе, используя PropertyPlaceholderConfigurer следующим образом:Spring @PropertySource и окружающая среда Преобразование типов

<context:property-placeholder location="classpath:my.properties" /> 

    <bean id="myBean" class="com.whatever.TestBean"> 
    <property name="someValue" value="${myProps.value}" /> 
    </bean> 

Где myprops.value=classpath:configFile.xml и присваиватель свойства «SomeValue» принимает org.springframework.core .io.Resource.

Это хорошо работает - PPC автоматически преобразует значение строки и ресурса.

Я сейчас пытаюсь использовать Java Config и @PropertySource аннотацию следующим образом:

@Configuration 
@PropertySource("classpath:my.properties") 
public class TestConfig { 

    @Autowired Environment environment; 

    @Bean 
    public TestBean testBean() throws Exception { 
     TestBean testBean = new TestBean(); 
     testBean.setSomeValue(environment.getProperty("myProps.value", Resource.class)); 
     return testBean; 
    } 

} 

Метод GetProperty() класса Spring по окружающей среде обеспечивает перегрузку для поддержки преобразования в различных типов, которые я «ве используется, однако это не по умолчанию поддержки преобразования свойство ресурса:

Caused by: java.lang.IllegalArgumentException: Cannot convert value [classpath:configFile.xml] from source type [String] to target type [Resource] 
    at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:81) 
    at org.springframework.core.env.AbstractEnvironment.getProperty(AbstractEnvironment.java:370) 
    at config.TestConfig.testBean(TestConfig.java:19) 

Глядя на основной исходный код, реализация окружающей среды использует PropertySourcesPropertyResolver, который, в свою очередь, использует DefaultConversionService и это только регистрирует очень простые преобразователи.

У меня есть два вопроса:
1) Как я могу получить это, чтобы поддержать преобразование в Ресурс?
2) Зачем мне это нужно, когда оригинальный PPC делает это для меня?

ответ

0

Я решил это следующим образом.

Я понял, что существует разница между получением свойства из ресурсного пакета, а затем установкой свойства в bean-компоненте. Spring будет выполнять преобразование при настройке свойства с помощью соответствующего PropertyEditor (ResourceEditor). Таким образом, мы должны сделать этот шаг вручную:

@Configuration 
@PropertySource("classpath:my.properties") 
public class TestConfig { 

    @Autowired Environment environment; 

    @Bean 
    public TestBean testBean() throws Exception { 
     ResourceEditor editor = new ResourceEditor(); 
     editor.setAsText(environment.getProperty("myProps.value")); 
     TestBean testBean = new TestBean(); 
     testBean.setSomeValue((Resource)editor.getValue()); 
     return testBean; 
    } 

} 

Однако это оставить выдающийся вопрос о том, почему DefaultConversionService используется внутри среды не подберут PropertyEditor автоматически. Это может быть связано с:

https://jira.springsource.org/browse/SPR-6564

0

Я столкнулся с той же проблемой, и оказалось, что context:property-placeholder не только загружает файлы свойств, но также объявляет специальный bean-компонент org.springframework.context.support.PropertySourcesPlaceholderConfigurer, который обрабатывает все файлы, например. разрешает ${...} свойства и их заменяет.

Для крепления его просто необходимо создать его экземпляр:

@Configuration 
public class TestConfig { 

    @Autowired Environment environment; 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer configurer(){ 
     PropertySourcesPlaceholderConfigurer postProcessor = new PropertySourcesPlaceholderConfigurer(); 
     postProcessor.setLocation(new ClassPathResource("my.properties")); 
     return postProcessor; 
    } 

... 

Обратите внимание, что вам нужно удалить @PropertySource("classpath:my.properties") аннотацию.

+0

Благодарности n1ckolas, я видел, что это сделано таким образом, прежде - как вы говорите, что это эквивалентно XML. Однако я думал, что это именно то, что должно было избегать аннотации @PropertySource? –

Смежные вопросы