最初,我有以下规格:
@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;
然后注释中的默认值工作正常,但我没有从属性文件中获得正确的值:
尝试使用
$
,如下所示:
@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;
}
对于
int
类型变量:
@Value("${my.int.config: #{100}}")
int myIntConfig;
注意:冒号之前没有空格,但冒号之后有一个额外的空格。
您问题的确切答案取决于参数的 type。
对于“字符串”参数,您的示例代码工作正常:
@Value("#{props.string.fpl:test}")
private String fpl = "test";
对于其他类型(例如问题中的布尔值),应该这样写:
@Value("${props.boolean.isFPL:#{false}}")
private boolean isFPL = false;
或“整数”:
@Value("${props.integer.fpl:#{20}}")
您的 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) 实际上被忽略。
对于字符串,您可以像这样默认为 null:
public UrlTester(@Value("${testUrl:}") String url) {
this.url = url;
}
取决于您加载属性的方式,如果您使用类似的东西
<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />
那么
@Value
应该看起来像
@Value("${isFPL:true}")
如果默认值是一个字符串,则如下指定:
@Value("${my.string.config:#{'Default config value'}}")
String myIntConfig;
只有当我们在 @Value 注释中写入“value=...”时,这种定义默认值的方法才有效。例如
不起作用:@Value("${testUrl:some-url}" // 无论您在配置文件中执行什么操作,这都将始终设置“some-url”。
Works : @Value(value = "${testUrl:some-url}" // 仅当配置文件中缺少 testUrl 属性时,才会设置“some-url”。