在Spring 4中,使用@Value注释,如果指定的属性不存在,将系统属性指定为默认值的正确方法是什么?
虽然这适用于非默认情况:
@Value("${myapp.temp}")
private String tempDirectory;
当我需要默认值时,这不起作用:
@Value("#{myapp.temp ?: systemProperties.java.io.tmpdir}")
private String tempDirectory;
这也不是:
@Value("#{myapp.temp ?: systemProperties(java.io.tmpdir)}")
private String tempDirectory;
在Spring尝试创建bean时,这些都给了我一个例外:
org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'configurationService': Invocation of init method failed;
nested exception is java.lang.NullPointerException
可以这样做吗?
答案 0 :(得分:9)
我尝试了以下内容,它对我有用:
@Value("${myapp.temp:#{systemProperties['java.io.tmpdir']}}")
private String tempDirectory;
我认为缺少的部分不是?:
而是需要#{}
。根据这个answer:
${...}
是属性占位符语法。它只能用于取消引用属性。
#{...}
是SpEL语法,它更强大,更复杂。它还可以处理属性占位符,还有更多。
所以基本上发生的事情是我们告诉Spring首先使用myapp.temp
语法将${}
解释为属性占位符语法。然后,我们使用:
代替?:
(称为Elvis operator),因为elvis运算符仅适用于Spring Expression Language表达式,而不适用于属性占位符语法。我们语句的第三部分是#{systemProperties['java.io.tmpdir']}
,它告诉Spring将下一个表达式解释为Spring Expression并允许我们获取系统属性。
答案 1 :(得分:1)
试试systemProperties['java.io.tmpdir']
。
这是一张地图,所以如果键名中有一个点,则应使用[..]
答案 2 :(得分:0)
对我来说,它只适用于不同的属性名称(property.name.a是一个键,我的application.properties中的值,property.name.b是一个环境变量),如:
<?php
function test($page)
{
if($page == '') {
$page = 1;
}
if($page == 1)
{
$start = 0;
$end = 10;
}
else
{
$start = ($page-1)*10;
$end = 10;
}
$query = "SELECT * FROM tbl_name LIMIT $start,$end";
// further process with data.
}
?>
相同的名称对我来说并不像预期的那样(加载默认值,当第一个属性不存在时),例如:
@Value("${property.name.a:${property.name.b}}")