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}'
只是缺少空默认值的:
。谢谢