Spring @Value 注解方法,属性不可用时使用默认值
Posted
技术标签:
【中文标题】Spring @Value 注解方法,属性不可用时使用默认值【英文标题】:Spring @Value annotated method, use default value when properties not available 【发布时间】:2017-08-31 12:06:21 【问题描述】:情况
我将 .properties 文件中的属性注入到带有 @Value 注释的字段中。但是,此属性提供敏感凭据,因此我将它们从存储库中删除。如果有人想要运行项目并且没有带有默认值将设置为字段的凭据的 .properties 文件,我仍然希望这样做。
问题
即使我将默认值设置为字段本身,当 .properties 文件不存在时也会出现异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxx': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'secret' in string value "$secret"
这里是带注释的字段:
@Value("$secret")
private String ldapSecret = "secret";
我预计在这种情况下只会设置普通字符串“secret”。
【问题讨论】:
How to correctly specify a default value in the Spring @Value annotation?的可能重复 【参考方案1】:实际上将始终使用默认值。为了克服这个问题,我使用了一个字符串值
@Value("$prop")
String propValue;//if no prop defined, the propValue is set to the literal "$prop"
....
if("$prop".equals(propValue))
propValue=defaultValue
【讨论】:
这根本不是真的。【参考方案2】:@Value and Property Examples
To set a default value for property placeholder :
$property:default value
Few examples :
//@PropertySource("classpath:/config.properties")
//@Configuration
@Value("$mongodb.url:127.0.0.1")
private String mongodbUrl;
@Value("#'$mongodb.url:172.0.0.1'")
private String mongodbUrl;
@Value("#config['mongodb.url']?:'127.0.0.1'")
private String mongodbUrl;
【讨论】:
【参考方案3】:要准确回答您的问题...
@Value("$secret:secret")
private String ldapSecret;
为了示例的完整性,下面还有一些变体......
默认一个字符串为空:
@Value("$secret:#null")
private String secret;
默认一个数字:
@Value("$someNumber:0")
private int someNumber;
【讨论】:
您可以了解到 Spring 表达式语言可用于解决此问题。例如@Value("$secret:#null")
.
这是一个很好的答案,但它并不能解决问题。它解释了系统应该如何工作,但截至 2017 年 10 月,Spring 4.2.4,它实际上并没有以这种方式工作。如果您在 @value 注释中指定默认值,则不会使用属性文件中的实际值。如果您从注解中删除默认值,则使用属性文件中的值 -- 除非它丢失,在这种情况下会抛出异常以尝试实例化 Bean。
如果有默认值,Spring 看不到属性文件中的值,截至 2020 年 2 月。无法同时使用默认值和属性文件中的值
这种定义默认值的方式只有在注释中添加'value='时才有效。例如如果在配置文件中找不到属性,@Value(value="$secret:secret") 将使用默认值。【参考方案4】:
只需使用:
@Value("$secret:default-secret-value")
private String ldapSecret;
【讨论】:
以上是关于Spring @Value 注解方法,属性不可用时使用默认值的主要内容,如果未能解决你的问题,请参考以下文章
[坑]Spring利用注解@Value获取properties属性为null
SpringBoot系列之@PropertySource和@Value注解