最初,我有以下规范:
@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;
然后注释中的默认值工作正常但我没有从属性文件中获取正确的值:
答案 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”。>