我试图在构造函数的参数中使用@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,但是事实并非如此。

我发现通过调试器运行代码(只有在将@Value("${encryptor.poolSize:10}") Integer poolSize更改为@Value("${encryptor.poolSize:10}") String poolSize之后才起作用,因为这会导致NumberFormatExceptions),我发现未设置默认值,并且参数的形式为:
poolSize = ${encryptor.poolSize:10}
algorithm = ${encryptor.algorithm:"PBEWithMD5AndTripleDES"}

而不是预期的
poolSize = 10
algorithm = "PBEWithMD5AndTripleDES"

基于SPR-4785,诸如$ {my.property:myDefaultValue}之类的符号应该可以使用。但这对我来说还没有发生!

谢谢

最佳答案

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

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

另外,您也不需要在默认值周围添加"..."

09-25 20:19