gpt4 book ai didi

java - 使用 Spring 表达式语言以编程方式评估 bean 表达式

转载 作者:IT老高 更新时间:2023-10-28 13:49:49 26 4
gpt4 key购买 nike

我有一个简单的 Spring Bean 表达式,当我在应用程序上下文文件中定义它时,它的计算结果很好:

<bean id="myConfigBean" class="com.example.myBeanConfigBean">
<property name="myProperty" value="#{ someOtherBean.getData() }"/>
</bean>

现在,我想以编程方式进行相同的评估。我使用了以下代码:

final ExpressionParser parser = new SpelExpressionParser();
final TemplateParserContext templateContext = new TemplateParserContext();
Expression expression = parser.parseExpression("#{ someOtherBean.getData() }", templateContext);
final String value = (String) expression.getValue();

这会引发异常:

EL1007E:(pos 22): Field or property 'someOtherBean' cannot be found on null

我想我必须以某种方式设置一个根对象,以允许配置的 bean 像属性一样。但我还没有让它工作。任何人,谁已经这样做并且可以给出提示?

最佳答案

实现 BeanFactoryAware 以获取对 bean 工厂的引用;那么……

StandardEvaluationContext context = new StandardEvaluationContext();
context.setBeanResolver(new BeanFactoryResolver(this.beanFactory));
Expression expression = parser.parseExpression("@someOtherBean.getData()");
// or "@someOtherBean.data"
final String value = expression.getValue(context, String.class);

编辑

回答下面的评论。 @ 触发使用 bean factory resolver 来访问 bean;另一种方法是将 BeanExpressionContextAccessor 添加到评估上下文并使用 BeanExpressionContext 作为评估的根对象...

final ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setBeanResolver(new BeanFactoryResolver(beanFactory));
context.addPropertyAccessor(new BeanExpressionContextAccessor());
Expression expression = parser.parseExpression("someOtherBean.getData()");
BeanExpressionContext rootObject = new BeanExpressionContext(beanFactory, null);

...

String value = expression.getValue(context, rootObject, String.class);

关于java - 使用 Spring 表达式语言以编程方式评估 bean 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11616316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com