Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带嵌套条件的SpEL@Value_Java_Spring_Spring El - Fatal编程技术网

Java 带嵌套条件的SpEL@Value

Java 带嵌套条件的SpEL@Value,java,spring,spring-el,Java,Spring,Spring El,我正在使用@Value注释,现在我希望它更复杂一点。我有两个配置值-val1,和val2。我想按如下方式注入它:如果配置中存在val1,请使用它。否则,如果val2为true,则注入default1。如果为false,则注入default2 我试过这样的方法: @Value(#{val1?val1:(val2?'default1':'default2')) 但我一直得到: `EL1008E`: property or filed 'val1' cannot be found on object

我正在使用
@Value
注释,现在我希望它更复杂一点。我有两个配置值-
val1
,和
val2
。我想按如下方式注入它:如果配置中存在
val1
,请使用它。否则,如果
val2
为true,则注入
default1
。如果为false,则注入
default2

我试过这样的方法:

@Value(#{val1?val1:(val2?'default1':'default2'))

但我一直得到:

`EL1008E`: property or filed 'val1' cannot be found on object of type 'org.springframeowrk.beans.factory.config.BeanExpressionContext' - maybe not public or not valid?
当我尝试其他表达式时,例如
${val1}
'${val1}'
它似乎仍然不起作用


@Value
注释中嵌套条件的正确方法是什么,还是太复杂了?

我已经调整了表达式,并编写了一个小测试来说明更改。简而言之,使用
${some.prop:defaultVal}
定义默认值,并使用
${some.prop:}
将空字符串定义为默认值。此外,在SPEL表达式中使用单引号
来指示字符串值,而不是引用

使用
TestPropertySource
验证结果。我添加了第二个测试,以表明当默认值不存在时,Spring可能(并非总是)决定返回占位符的文本表示


导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.springframework.beans.factory.annotation.Value;
导入org.springframework.test.context.TestPropertySource;
导入org.springframework.test.context.junit4.SpringRunner;
导入静态org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@TestPropertySource(属性={“val1=v1”,“val2=v2”})
公共类测试{
@值(“${val1:}'!=”?${val1}':(“${val2:}'!=”?'default1':'default2'))
私有字符串testVal;
@值(${nonExistingValue}”)
私有字符串不存在值;
@试验
公开无效测试(){
资产(testVal).isEqualTo(“v1”);
}
@试验
public void testnoexistingvalue(){
assertThat(nonExistingValue).isEqualTo(${nonExistingValue}”);
}
}

虽然上面的表达式可以工作,但我强烈建议使用,或引用静态方法。当表达式变得更复杂时,当前设置的可读性可能会更差。

我已经调整了表达式,并编写了一个小测试来说明更改。简而言之,使用
${some.prop:defaultVal}
定义默认值,并使用
${some.prop:}
将空字符串定义为默认值。此外,在SPEL表达式中使用单引号
来指示字符串值,而不是引用

使用
TestPropertySource
验证结果。我添加了第二个测试,以表明当默认值不存在时,Spring可能(并非总是)决定返回占位符的文本表示


导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.springframework.beans.factory.annotation.Value;
导入org.springframework.test.context.TestPropertySource;
导入org.springframework.test.context.junit4.SpringRunner;
导入静态org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@TestPropertySource(属性={“val1=v1”,“val2=v2”})
公共类测试{
@值(“${val1:}'!=”?${val1}':(“${val2:}'!=”?'default1':'default2'))
私有字符串testVal;
@值(${nonExistingValue}”)
私有字符串不存在值;
@试验
公开无效测试(){
资产(testVal).isEqualTo(“v1”);
}
@试验
public void testnoexistingvalue(){
assertThat(nonExistingValue).isEqualTo(${nonExistingValue}”);
}
}

虽然上面的表达式可以工作,但我强烈建议使用,或引用静态方法。当表达式变得更复杂时,当前设置的可读性可能会更低。

您的测试似乎对我不起作用,因为如果我从
属性中删除
“val1=v1”
,我将得到以下错误:
java.lang.IllegalArgumentException:无法解析值“#{'${val1:}中的占位符“val1”“!=”?“${val1}”:(“${val2:}”!=“'default1':'default2')}”
Ah,第二个
'${val1}'
的默认值为空,只是缺少
。感谢您的测试似乎对我不起作用,因为如果我从
properties
中删除
“val1=v1”
,我将得到以下错误:
java.lang.IllegalArgumentException:无法解析值“{${val1:}”!=”?${val1}:(${val2:}!=”?'default1:'default2')}”
Ah,第二个
'${val1}'
只是缺少空默认值的
。谢谢