2012-07-23 9 views
9

ho una semplice espressione Primavera Bean, che valuta bene quando mi definisco all'interno di un file di contesto di applicazione:programmazione valutare un'espressione di fagioli con molla Expression Language

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

Ora, voglio fare la stessa valutazione a livello di codice . Ho usato il seguente codice:

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

Questo genera un'eccezione:

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

mi sa che devo impostare un oggetto radice in qualche modo che permette ai fagioli configurati come una proprietà. Ma non l'ho ancora fatto funzionare. Chiunque, chi l'ha già fatto e potrebbe dare un suggerimento?

risposta

7

implementare BeanFactoryAware per ottenere un riferimento al bean factory; poi ...

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

Per rispondere alla commento qui sotto. @ attiva l'uso del resolver factory bean per accedere a un bean; in alternativa è quella di aggiungere un BeanExpressionContextAccessor al contesto di valutazione e utilizzare un BeanExpressionContext come l'oggetto principale per la valutazione ...

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

Posso usare l'espressione precedente senza il simbolo '@'? @ someOtherBean.getData() >> someOtherBean.getData(). – RiyasAbdulla

+0

Non senza configurazione aggiuntiva; vedi la modifica alla mia risposta. Dovresti davvero fare una nuova domanda - gli amministratori qui non amano le nuove domande nei commenti. –

1

prega di dare un'occhiata @https://www.mkyong.com/spring3/test-spring-el-with-expressionparser/

codice di esempio 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); 

    } 
} 
Problemi correlati