Spring 4 @Value,其中property default是一个java系统属性

时间:2015-06-29 16:11:22

标签: java spring

在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

可以这样做吗?

3 个答案:

答案 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}}")