将Spring @Value注解作为基本布尔值进行评估

mzaanser  于 2023-10-15  发布在  Spring
关注(0)|答案(5)|浏览(183)

我有一个Spring @Configuration注解的类MappingsClientConfig,其布尔字段为:

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

这个类被导入到另一个Spring注解的类中,如下所示:

@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

有什么线索能告诉我我错过了什么吗?

e5nqia27

e5nqia271#

这是一个老线程,但如果你仍然想使用@Value Spring annotation注入非字符串值,请这样做:

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

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

我在Sping Boot 1.5.9和Java 8上工作。

8ulbf1ek

8ulbf1ek2#

看起来你缺少了PropertyPlaceholderConfigurer。您需要将其注册为bean工厂后处理器。理论上可以这样做:

public class PostProcessorConfig {

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

然而,似乎有一个bug,导致其他问题这样做,从基于java的配置。有关变通方法,请参见票证。

7hiiyaii

7hiiyaii3#

这就是我们在项目中解决问题的方式,因为其他答案对我们不起作用。我们也用了春批。
主作业配置:

@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中的,但加载该选项的实际属性是在作业类中指定的。

4jb9z9bj

4jb9z9bj4#

您甚至不需要属性文件,例如:

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

xurqigkl5#

从Spring Framework 5.3.22和Java 11开始,你可以使用简单的声明:

@Value("${some.value}")
private boolean isSmth;

application.yaml中的相应属性:

some:
  value: true

相关问题