2012-07-23 73 views
9

我有一个简单的Spring bean表达,当我把它定义一个应用程序上下文文件中,其评价罚款:编程评估与Spring表达式语言豆表达

<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 

我想我必须以某种方式设置一个根对象,允许配置的豆等的性质。但我还没有得到它的工作。任何人,谁已经这样做,并可以提供一个提示?

回答

7

实现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;另一种是将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); 
+0

我可以使用不带'@'符号的上述表达式吗? @ someOtherBean.getData()>> someOtherBean.getData()。 – RiyasAbdulla 2017-04-23 05:11:13

+0

不需要额外的配置;看到编辑我的答案。你真的应该问一个新问题 - 管理员不喜欢评论中的新问题。 – 2017-04-23 14:03:28

1

请看看@https://www.mkyong.com/spring3/test-spring-el-with-expressionparser/

Java代码示例,

import org.springframework.expression.Expression; 
import org.springframework.expression.ExpressionParser; 
import org.springframework.expression.spel.standard.SpelExpressionParser; 
import org.springframework.expression.spel.support.StandardEvaluationContext; 

public class App { 
    public static void main(String[] args) { 

     ExpressionParser parser = new SpelExpressionParser(); 

     //literal expressions 
     Expression exp = parser.parseExpression("'Hello World'"); 
     String msg1 = exp.getValue(String.class); 
     System.out.println(msg1); 

     //method invocation 
     Expression exp2 = parser.parseExpression("'Hello World'.length()"); 
     int msg2 = (Integer) exp2.getValue(); 
     System.out.println(msg2); 

     //Mathematical operators 
     Expression exp3 = parser.parseExpression("100 * 2"); 
     int msg3 = (Integer) exp3.getValue(); 
     System.out.println(msg3); 

     //create an item object 
     Item item = new Item("mkyong", 100); 
     //test EL with item object 
     StandardEvaluationContext itemContext = new StandardEvaluationContext(item); 

     //display the value of item.name property 
     Expression exp4 = parser.parseExpression("name"); 
     String msg4 = exp4.getValue(itemContext, String.class); 
     System.out.println(msg4); 

     //test if item.name == 'mkyong' 
     Expression exp5 = parser.parseExpression("name == 'mkyong'"); 
     boolean msg5 = exp5.getValue(itemContext, Boolean.class); 
     System.out.println(msg5); 

    } 
}