2012-07-23 14 views
9

と豆の式を評価する:今すぐプログラム私はアプリケーションコンテキストファイル内に定義するときに細かい評価シンプルな春の豆の発現、持って春の式言語

<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); 

EDITは、以下のコメントに答えるために。 @は、BeanにアクセスするためにBeanファクトリリゾルバの使用をトリガします。代替は

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

+0

追加設定なし。私の答えに編集を参照してください。あなたは本当に新しい質問をするべきです - ここの管理者はコメントに新しい質問が好きではありません。 –

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); 

    } 
} 
@を見てください...評価コンテキストに BeanExpressionContextAccessorを追加して、評価のためのルートオブジェクトとして BeanExpressionContextを使用することです
関連する問題