当属性不存在时,弹簧@Value注释不使用默认值

2022-09-01 23:13:10

我正在尝试在构造函数的参数中使用@Value注释,如下所示:

@Autowired
public StringEncryptor(
    @Value("${encryptor.password:\"\"}") String password,
    @Value("${encryptor.algorithm:\"PBEWithMD5AndTripleDES\"}") String algorithm,
    @Value("${encryptor.poolSize:10}") Integer poolSize, 
    @Value("${encryptor.salt:\"\"}") String salt) {
...
}

当属性文件存在于类路径上时,属性将完美加载,并且测试可以正常执行。但是,当我从类路径中删除属性文件时,我本来希望使用默认值,例如poolSize将设置为10或算法设置为PBEWithMD5AndTripleDES,但事实并非如此。

通过调试器运行代码(只有在更改为导致NumberFormatExceptions之后才能工作),我发现没有设置默认值,参数采用以下形式:@Value("${encryptor.poolSize:10}") Integer poolSize@Value("${encryptor.poolSize:10}") String poolSize

poolSize = ${encryptor.poolSize:10}

algorithm = ${encryptor.algorithm:"PBEWithMD5AndTripleDES"}

而不是预期的

poolSize = 10

algorithm = "PBEWithMD5AndTripleDES"

基于 SPR-4785,诸如 ${my.property:myDefaultValue} 之类的符号应该可以正常工作。然而,这对我来说并没有发生!

谢谢


答案 1

可能由于缺少属性文件而导致属性占位符配置器初始化失败,因此无法解析占位符。您可以将其配置为忽略丢失的文件,如下所示(如果您使用命名空间对其进行配置):context

<context:property-placeholder ignore-resource-not-found="true" ... />

此外,您也不需要默认值。"..."


答案 2

ignore-resource-not-found=“true” 对于选取默认值不是必需的。指定默认值的要点是,如果在任何地方都找不到该属性,则使用它。

我认为上一个答案中的最后一句话指出了问题 - 您最初必须提供的错误EL,但后来从示例中删除。您收到格式转换异常的事实也表明了这一点。通常,Spring会自动将字符串转换为适当的“标准”Java类型,如果您提供自己的Spring转换服务实现,则只要在应用程序上下文中定义转换服务,也可以转换为自定义对象。

“ignore-resource-not-found”在以下情况下非常有用:通过 XML 注入属性而不使用默认值,并且不希望容器在找不到任何属性的情况下引发实例化 Bean 的异常。在这种情况下,Bean属性将使用Java默认值进行初始化,例如,对象的nulls,原始数值的0等。


推荐