15

アプリケーションコンテキストファイル内で定義すると、うまく評価される単純なSpring Bean Expressionがあります。

<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を許可するルートオブジェクトを何らかの方法で設定する必要があると思います。しかし、私はまだそれを機能させていません。すでにこれを行っていて、ヒントを与えることができる人はいますか?

4

2 に答える 2

20

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別の方法は、評価コンテキストにa を追加し、評価BeanExpressionContextのルート オブジェクトとして a を使用することです...

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);
于 2012-07-23T16:53:05.187 に答える