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

时间:2014-11-13 19:13:46

标签: java spring properties annotations

最初,我有以下规范:

@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):解析有效表达式后,表达式中还有更多数据:'冒号(:)'

我也尝试用$而不是#。

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

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

6 个答案:

答案 0 :(得分:22)

尝试使用$,如下

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

还要确保将ignore-resource-no-found设置为true,以便在缺少属性文件时,将采用默认值。

另外,请将以下内容放在 -

如果使用基于xm的配置,则为上下文文件:

<context:property-placeholder ignore-resource-not-found="true"/>
Configuration类中的

如果使用Java配置:

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

    return p;
 }

答案 1 :(得分:5)

对于int类型变量:

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

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

答案 2 :(得分:2)

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

apt-get update

如果是这样,那么属性查找: props.isFPL 只会发生在第一个属性文件( .local.properties )中,如果找不到属性,默认值( true )将生效,此属性实际上会忽略第二个属性文件( config.properties )。

答案 3 :(得分:1)

取决于您使用

之类的内容加载属性的方式

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

然后@Value应该是

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

答案 4 :(得分:1)

对于String,您可以默认为null,如下所示:

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

答案 5 :(得分:-1)

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

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

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