2012-07-23 77 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); 

    } 
}