当前位置: 首页 > 面试题库 >

使用Spring表达式语言以编程方式评估Bean表达式

赫连明诚
2023-03-14
问题内容

我有一个简单的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工厂解析器来访问一个bean;
另一种方法是将a添加BeanExpressionContextAccessor到评估上下文中,并使用a
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);


 类似资料:
  • 本文向大家介绍Python用eval评估表达式,包括了Python用eval评估表达式的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 什么是实现将采用字符串并根据运算符优先级输出结果的python程序的最佳方法(例如:“ 4 + 3 * 5”将输出19)。我在谷歌上寻找解决这个问题的方法,但是它们都太复杂了,我正在寻找一个(相对)简单的方法。 澄清:我需要比eval()稍微先进的东西-我希望能够添加其他运算符(例如,最大运算符-4 $ 2 = 4),或者,我对此在学术上比对专业更感兴趣-我想知道 该怎么 做。 问题答

  • 本文向大家介绍评估后缀表达式,包括了评估后缀表达式的使用技巧和注意事项,需要的朋友参考一下 为了求解数学表达式,我们需要前缀或后缀形式。将中缀转换为后缀后,我们需要后缀评估算法来找到正确的答案。 在这里,我们还必须使用堆栈数据结构来解决后缀表达式。 从后缀表达式中,找到一些操作数后,将它们压入堆栈。找到某个运算符后,将从堆栈中弹出两个项目,并按正确的顺序执行操作。之后,结果也被压入堆栈中以备将来使

  • 本文章将介绍Thymeleaf Spring表达式语法中的概念。 Spring Expression Language(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。 语言语法类似于Unified EL,但提供了额外的功能,特别是方法调用和基本的字符串模板功能。 Spring表达式语言的创建旨在为Spring社区提供单一支持的表达式语言。 它的语言特性是由Spring项目中的

  • 主要内容:示例,SpEL对Bean定义的支持,SpEL中的运算符,SpEL中的变量Spring Expression Language(简称 SpEL)是一种功能强大的表达式语言,支持运行时查询和操作对象图 。表达式语言一般是用最简单的形式完成最主要的工作,以此减少工作量。 Java 有许多可用的表达式语言,例如 JSP EL,OGNL,MVEL 和 JBoss EL,SpEL 语法类似于 JSP EL,功能类似于 Struts2 中的 OGNL,能在运行时构建复杂表达式、存取