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

gar*_*ryj 22 java spring annotations

我试图在构造函数的参数中使用@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) {
...
}
Run Code Online (Sandbox Code Playgroud)

当类路径中存在属性文件时,属性将完美加载并且测试执行正常.但是,当我从类路径中删除属性文件时,我原本期望使用默认值,例如poolSize将设置为10或算法设置为PBEWithMD5AndTripleDES但是情况并非如此.

通过调试运行代码(这只会改变工作后,@Value("${encryptor.poolSize:10}") Integer poolSize@Value("${encryptor.poolSize:10}") String poolSize我发现的默认值没有被设置为这是造成NumberFormatExceptions)和参数的形式:

poolSize = ${encryptor.poolSize:10} 要么

algorithm = ${encryptor.algorithm:"PBEWithMD5AndTripleDES"}
Run Code Online (Sandbox Code Playgroud)

而不是预期的

poolSize = 10 要么

algorithm = "PBEWithMD5AndTripleDES"
Run Code Online (Sandbox Code Playgroud)

基于SPR-4785,$ {my.property:myDefaultValue}等符号应该有效.但它并没有发生在我身上!

谢谢

axt*_*avt 23

由于遗漏属性文件,属性占位符配置器的初始化可能会失败,因此不会解析占位符.您可以将其配置为忽略丢失的文件,如下所示(如果使用context命名空间进行配置):

<context:property-placeholder ignore-resource-not-found="true" ... />
Run Code Online (Sandbox Code Playgroud)

此外,您不需要"..."大约默认值.


小智 6

ignore-resource-not-found ="true"不需要拾取默认值.如果在任何地方找不到属性,则指定默认值的点是使用它.

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

当您通过XML注入属性而没有默认值时,"ignore-resource-not-found"非常有用,并且如果没有找到属性,则不希望容器抛出实例化bean的异常.在这种情况下,bean属性将使用Java默认值进行初始化,例如,对象为null,原始数值为0,等等.