Оценка spring аннотации @value как примитивной логической
У меня есть аннотированный класс spring @configuration MappingsClientConfig с булевым полем как:
@Value("${mappings.enabled:true}")
private boolean mappingsEnabled;
Этот класс импортируется в класс spring, аннотированный следующим образом:
@Configuration
@Import(MappingsClientConfig.class)
public class LookupManagerConfig {
при создании экземпляра класса через контекст spring в тестовом случае контейнер не может выполнить синтаксический анализ строки в булевых сопоставлениях полейEnabled, и я получаю:
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private boolean com.barcap.tcw.mappings.economic.client.config.EconomicMappingsClientConfig.economicMappingsEnabled; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${mappings.enabled:true}]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:502)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282)
... 138 more
Caused by: org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${mappings.enabled:true}]
at org.springframework.beans.SimpleTypeConverter.convertIfNecessary(SimpleTypeConverter.java:61)
at org.springframework.beans.SimpleTypeConverter.convertIfNecessary(SimpleTypeConverter.java:43)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:718)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474)
... 140 more
Caused by: java.lang.IllegalArgumentException: Invalid boolean value [${mappings.enabled:true}]
at org.springframework.beans.propertyeditors.CustomBooleanEditor.setAsText(CustomBooleanEditor.java:124)
at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:416)
at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:388)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:157)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:93)
at org.springframework.beans.SimpleTypeConverter.convertIfNecessary(SimpleTypeConverter.java:49)
... 144 more
Любые приводят к тому, что мне не хватает?
Ответы
Ответ 1
Похоже, вам не хватает PropertyPlaceholderConfigurer. Вам необходимо зарегистрировать его как почтовый процессор bean factory. Теоретически это можно сделать следующим образом:
public class PostProcessorConfig {
@Bean
public BeanFactoryPostProcessor getPP() {
PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
configurer.setLocations(new Resource[]{new ClassPathResource("/my.properties")});
return configurer;
}
}
Однако существует ошибка которая вызывает другие проблемы, связанные с настройкой на основе java. Просмотреть билет для обходных путей.
Ответ 2
Вот как это было решено в нашем проекте, так как другие ответы не сработали для нас. Мы также использовали пакет spring.
главная конфигурация задания:
@Configuration
@EnableBatchProcessing
@PropertySource("classpath:application.properties")
public class MainJobConfiguration {
@Autowired
PipelineConfig config;
@Bean
public PipelineConfig pipelineConfig(){
return new PipelineConfig();
}
// To resolve ${} in @Value
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
// job stuff ...
}
свойства config loader:
public class PipelineConfig {
@Value("${option}")
private boolean option;
}
Обратите внимание на то, что @Value
находится в PipelineConfig, но фактические свойства, из которых загружен этот параметр, указаны в классе заданий.
Ответ 3
Вам даже не нужен файл свойств, например:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" />
Ответ 4
Его старый поток, но если вы все еще хотите вводить значения Non-String с помощью аннотации @Value Spring, сделайте следующее:
@Value("#{new Boolean('${item.priceFactor}')}")
private Boolean itemFactorBoolean;
@Value("#{new Integer('${item.priceFactor}')}")
private Integer itemFactorInteger;
Работает для меня на Spring загрузке 1.5.9 с Java 8.