【问题标题】:Spring @Value annotated method, use default value when properties not availableSpring @Value 注解方法,属性不可用时使用默认值
【发布时间】: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”。

【问题讨论】:

标签: java spring spring-boot spring-annotations properties-file


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2011-06-09
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      相关资源
      最近更新 更多