如何在Spring @Value注解中正确指定默认值?

问题描述 投票:0回答:8

最初,我有以下规格:

@Value("#{props.isFPL}")
private boolean isFPL=false;

这可以正确地从属性文件中获取值:

isFPL = true

但是,以下具有默认值的表达式会导致错误:

@Value("#{props.isFPL:false}")
private boolean isFPL=false;

表达式解析失败;嵌套异常是 org.springframework.expression.spel.SpelParseException: EL1041E:(pos 28): 解析有效表达式后,表达式中还有更多数据: 'colon(:)'

我还尝试使用 $ 而不是 #。

@Value("${props.isFPL:true}")
private boolean isFPL=false;

然后注释中的默认值工作正常,但我没有从属性文件中获得正确的值:

java spring properties annotations
8个回答
69
投票

尝试使用

$
,如下所示:

@Value("${props.isFPL:true}")
private boolean isFPL=false;

还要确保将

ignore-resource-no-found
设置为 true,以便如果属性文件丢失,将采用 default 值。

如果使用基于 XML 的配置,请将以下内容放入上下文文件中:

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

如果使用 Java 配置:

 @Bean
 public static PropertySourcesPlaceholderConfigurer   propertySourcesPlaceholderConfigurer() {
     PropertySourcesPlaceholderConfigurer p =  new PropertySourcesPlaceholderConfigurer();
     p.setIgnoreResourceNotFound(true);

    return p;
 }

19
投票

对于

int
类型变量:

@Value("${my.int.config: #{100}}")
int myIntConfig;

注意:冒号之前没有空格,但冒号之后有一个额外的空格。


9
投票

您问题的确切答案取决于参数的 type

对于“字符串”参数,您的示例代码工作正常:

@Value("#{props.string.fpl:test}")
private String fpl = "test";

对于其他类型(例如问题中的布尔值),应该这样写:

@Value("${props.boolean.isFPL:#{false}}")
private boolean isFPL = false;

或“整数”:

@Value("${props.integer.fpl:#{20}}")

3
投票

您的 Spring 应用程序上下文文件是否包含多个 propertyPlaceholder bean,如下所示:

<context:property-placeholder ignore-resource-not-found="true" ignore-unresolvable="true" location="classpath*:/*.local.properties" />
<context:property-placeholder location="classpath:/config.properties" />

如果是这样,则仅对第一个属性文件(.local.properties)进行属性查找:props.isFPL,如果未找到属性,则默认值(true)将生效,并且对于此属性,第二个属性文件 (config.properties) 实际上被忽略。


3
投票

对于字符串,您可以像这样默认为 null:

public UrlTester(@Value("${testUrl:}") String url) {
    this.url = url;
}

2
投票

取决于您加载属性的方式,如果您使用类似的东西

<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />

那么

@Value
应该看起来像

@Value("${isFPL:true}")

0
投票

如果默认值是一个字符串,则如下指定:

@Value("${my.string.config:#{'Default config value'}}")
String myIntConfig;

-4
投票

只有当我们在 @Value 注释中写入“value=...”时,这种定义默认值的方法才有效。例如

不起作用:@Value("${testUrl:some-url}" // 无论您在配置文件中执行什么操作,这都将始终设置“some-url”。

Works : @Value(value = "${testUrl:some-url}" // 仅当配置文件中缺少 testUrl 属性时,才会设置“some-url”。

© www.soinside.com 2019 - 2024. All rights reserved.