当前位置: 首页 > 知识库问答 >
问题:

将Spring@Value注释评估为原始布尔值

毋炳
2023-03-14

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

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

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

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

在测试用例中通过Spring上下文实例化类时,容器无法将字符串解析为布尔字段<code>mappingsEnabled</code>,我得到:

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

关于我错过了什么的任何线索?

共有3个答案

史俊德
2023-03-14

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

主要作业配置:

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

申宜
2023-03-14

看起来您缺少 PropertyPlaceholderConfigurer。您需要将其注册为 Bean 工厂后处理器。从理论上讲,这可以像这样完成:

public class PostProcessorConfig {

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

然而,在基于java的配置中,似乎存在导致其他问题的bug。有关解决方法,请参阅票据。

欧阳俊逸
2023-03-14

这是一个旧线程,但如果您仍然想使用 Spring 注释注入非字符串值@Value请执行以下操作:

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

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

在带有Java 8的Spring boot 1.5.9上为我工作。

 类似资料:
  • 问题内容: 因此,我有一个简单的属性文件,其中包含以下条目: 该属性文件使用加载,该文件引用了上面的属性文件。 我有以下课程,为此,我正在尝试加载这些属性,如下所示: 问题是,并且总是为空…但是在我的控制器中,该值正好被加载。是什么赋予了? 问题答案: 如果通过手动实例化的实例,则不会涉及Spring,因此注释将被忽略。 如果您无法更改代码以使Spring实例化bean(也许使用-scoped b

  • 问题内容: 尝试在Spring 3.0.5.RELEASE中自动将属性连接到Bean ,我正在使用: config.properties: main-components.xml: MyClass: 结果,username被设置为字面值 ,因此表达式不会被解析。我对该类的其他自动关联依赖关系已设置,并且Spring不会引发任何异常。我也尝试添加,但没有帮助。 如果我将属性解析为单独的bean,然后

  • 问题内容: 我是Spring的新手,尝试使用带注释的控制器内部的注释注入带有值的字符串,并且将字符串的值作为字符串而不是属性文件中的值进行评估。 下面是我要插入的字符串“ message”的控制器。 我的应用程序上下文如下所示: 我的属性文件包含以下行: Spring必须在某个时候获取该值,因为每当我更改为不在属性文件之类的值时,都会出现异常。 问题答案: 似乎已经有人问过这个问题,Spring

  • 我试图用Spring框架构建一个控制台应用程序。 我有一个由注释的类: 和由注释的类 但是,当我在中定义属性并使用默认配置文件时,属性将被分配。

  • 问题内容: 我如何布尔计算包含布尔表达式的字符串?喜欢: 用户应该能够定义自己的变量(),并定义自己的布尔表达式()。因此,我将所有表达式仅作为字符串使用。我如何评估它们? 问题答案: 您可以使用Nambari评论的ScriptEngine: 打印0。 还要注意,该表达式不是布尔表达式,而是按位运算。

  • 问题内容: 对象在Python中评估的真值是多少? 相关问题 Python中对象的布尔值:有关覆盖对象评估方式的讨论 问题答案: 可以测试任何对象的真值,以在if或while条件中使用或用作以下布尔运算的操作数。以下值为“假”: 没有 假 任何数值类型的零,例如,,,。 任何空序列,例如,,。 任何空映射,例如。 用户定义的类的实例,如果该类定义了或方法,则该方法返回整数0或bool value时