2012-11-27 27 views
11

我有一個彈簧@Configuration註解的類MappingsClientConfig用布爾字段爲:評價彈簧@value註釋作爲原始布爾

@Value("${mappings.enabled:true}") 
    private boolean mappingsEnabled; 

該類導入到另一彈簧註解的類,如下所示:

@Configuration 
@Import(MappingsClientConfig.class) 
public class LookupManagerConfig { 

當通過測試案例中的Spring上下文實例化類時,容器無法將該字符串解析爲布爾字段mappingsEnabled,我得到:

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 

任何導致我錯過了什麼?

+0

我認爲這個問題是由於你沒有加載你定義'mappings.enabled'的屬性文件引起的,但是我不能確定沒有更多的細節。 –

回答

5

看起來像缺少PropertyPlaceholderConfigurer。您需要將其註冊爲豆工廠後處理器。理論上,這可以做這樣的:

public class PostProcessorConfig { 

    @Bean 
    public BeanFactoryPostProcessor getPP() { 
     PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); 
     configurer.setLocations(new Resource[]{new ClassPathResource("/my.properties")}); 
     return configurer; 
    } 
} 

然而,似乎是一個bug導致從一個基於Java的配置這樣的其他問題。查看解決方案的故障單。

+1

添加PropertyPlaceholderConfigurer的確有竅門。但最初當我試圖定義一個新的PropertyPlaceholderConfigurer時,我得到了以前工作正常的丟失佔位符的錯誤。就好像定義新的PropertyPlaceholderConfigurer重寫了一些現有的行爲一樣。 因此,現在我已經定義了一個新的PPC,並將所有屬性添加到它加載的單個propeties文件中。但問題是這些屬性是從哪裏加載的? – 212

1

你甚至不需要屬性文件,例如:

 
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" /> 

+1

你能否澄清那條線在哪裏?在LookupManagerConfig的xml中?如果我理解的很好,是否應該相當於在LookupManagerConfig中添加'@Autowired PropertyPlaceholderConfigurer configurer;'來使用java config? – jmmut

+0

@jmmut顯然它會是applicationContext.xml! – positivecrux

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 ... 
} 

性能配置裝載機:

public class PipelineConfig { 
    @Value("${option}") 
    private boolean option; 
} 

注意@Value是如何在PipelineConfig,但是從該選項中實際加載的特性,在指定工作班。

0

一個老線程,但如果你仍然想使用@Value春天註釋注入非字符串值,這樣做:與Java 8

@Value("#{new Boolean('${item.priceFactor}')}") 
private Boolean itemFactorBoolean; 

@Value("#{new Integer('${item.priceFactor}')}") 
private Integer itemFactorInteger; 

作品在春季啓動1.5.9