2012-07-23 12 views
9

Mam proste Wiosna Bean wypowiedzi, rozpoznawaną w porządku kiedy zdefiniować go wewnątrz pliku kontekstowego aplikacji:programowo ocenić ekspresję Bean z Wiosna Expression Language

<bean id="myConfigBean" class="com.example.myBeanConfigBean"> 
    <property name="myProperty" value="#{ someOtherBean.getData() }"/> 
</bean> 

Teraz chcę zrobić taką samą ocenę programowo . Użyłem następujący kod:

final ExpressionParser parser = new SpelExpressionParser(); 
final TemplateParserContext templateContext = new TemplateParserContext(); 
Expression expression = parser.parseExpression("#{ someOtherBean.getData() }", templateContext); 
final String value = (String) expression.getValue(); 

ta zgłasza wyjątek:

EL1007E:(pos 22): Field or property 'someOtherBean' cannot be found on null 

Chyba muszę ustawić główny obiekt w jakiś sposób, który pozwala na skonfigurowanych ziaren takich jak nieruchomości. Ale nie udało mi się jeszcze go uruchomić. Ktoś, kto już to zrobił i może dać wskazówkę?

Odpowiedz

7

implement BeanFactoryAware, aby uzyskać referencję do fabryki fasoli; potem ...

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

Aby odpowiedzieć na komentarz poniżej. The @ uruchamia użycie resolwera fabryki komponentów bean, aby uzyskać dostęp do komponentu bean; alternatywą jest dodanie BeanExpressionContextAccessor w kontekście oceny i użyć BeanExpressionContext jako przedmiotu głównego do oceny ...

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

Czy mogę użyć powyższego wyrażenia bez symbolu "@"? @ someOtherBean.getData() >> someOtherBean.getData(). – RiyasAbdulla

+0

Nie bez dodatkowej konfiguracji; zobacz edycję do mojej odpowiedzi. Powinieneś zadać nowe pytanie - administratorzy nie lubią nowych pytań w komentarzach. –

1

Proszę spojrzeć @https://www.mkyong.com/spring3/test-spring-el-with-expressionparser/

kod Java Próbka

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

    } 
} 
Powiązane problemy