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

Dav*_*d H 8 java spring

在Spring 4中,使用@Value注释,如果指定的属性不存在,将系统属性指定为默认值的正确方法是什么?

虽然这适用于非默认情况:

@Value("${myapp.temp}")
private String tempDirectory;
Run Code Online (Sandbox Code Playgroud)

当我需要默认值时,这不起作用:

@Value("#{myapp.temp ?: systemProperties.java.io.tmpdir}")
private String tempDirectory;
Run Code Online (Sandbox Code Playgroud)

这也不是:

@Value("#{myapp.temp ?: systemProperties(java.io.tmpdir)}")
private String tempDirectory;
Run Code Online (Sandbox Code Playgroud)

在Spring尝试创建bean时,这两个都给了我一个例外:

org.springframework.beans.factory.BeanCreationException: Error creating bean  
     with name 'configurationService': Invocation of init method failed;
     nested exception is java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?

Ian*_*las 9

我尝试了以下内容,它对我有用:

@Value("${myapp.temp:#{systemProperties['java.io.tmpdir']}}")
private String tempDirectory;
Run Code Online (Sandbox Code Playgroud)

我相信你缺少的部分并没有使用?:和需要#{}.根据这个答案:

${...}是属性占位符语法.它只能用于取消引用属性.

#{...}是SpEL语法,它更强大,更复杂.它还可以处理属性占位符,还有更多.

所以基本上正在发生的事情是我们myapp.temp通过使用${}语法告诉Spring首先将其解释为属性占位符语法.然后我们使用:而不是?:(称为Elvis运算符),因为elvis运算符仅适用于Spring Expression Language表达式,而不适用于属性占位符语法.我们的声明的第三部分#{systemProperties['java.io.tmpdir']}是告诉Spring将下一个表达式解释为Spring Expression并允许我们获取系统属性.

  • 你不需要SpEL.`@Value("$ {myapp.temp:$ {java.io.tmpdir}}")工作均匀 (2认同)