我正在通过条件Bean提供值。如果满足条件,那么一切都很好,但是如果不满足条件(因此不存在bean),我的代码将失败。有没有什么方法可以检查bean是否事先定义。在SpEL中?
我尝试过类似
#{someBean? someBean.myValue:null}
,但无效。
答案 0 :(得分:1)
请参阅this answer,了解其工作原理...
@SpringBootApplication
public class So56189689Application {
public static void main(String[] args) {
SpringApplication.run(So56189689Application.class, args);
}
@Value("#{containsObject('foo') ? getObject('foo').foo : null}")
String foo;
@Bean
public ApplicationRunner runner() {
return args -> System.out.println(foo);
}
// @Bean
// public Foo foo() {
// return new Foo();
// }
public static class Foo {
private String foo = "bar";
public String getFoo() {
return this.foo;
}
public void setFoo(String foo) {
this.foo = foo;
}
}
}
编辑
SpEL表达式的#root
对象是BeanExpressionContext
,您可以在该上下文上调用containsObject()
和getObject()
方法。
这是BeanExpressionContext
中的代码:
public boolean containsObject(String key) {
return (this.beanFactory.containsBean(key) ||
(this.scope != null && this.scope.resolveContextualObject(key) != null));
}
public Object getObject(String key) {
if (this.beanFactory.containsBean(key)) {
return this.beanFactory.getBean(key);
}
else if (this.scope != null){
return this.scope.resolveContextualObject(key);
}
else {
return null;
}
}