2012-07-23 15 views
9

Tengo una sencilla expresión de beans Spring, que evalúa bien cuando me defino dentro de un archivo de contexto de aplicación:evaluar mediante programación una expresión de frijoles con expresión de Primavera Idioma

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

Ahora, lo que quiero hacer la misma evaluación mediante programación . He utilizado el siguiente código:

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

Esto produce una excepción:

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

supongo que tengo para fijar un objeto raíz de alguna manera que permite a los granos configurados como una propiedad. Pero no lo hice funcionar todavía. ¿Alguien que ya ha hecho esto y podría dar una pista?

Respuesta

7

implementa BeanFactoryAware para obtener una referencia a la fábrica de frijoles; entonces ...

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

EDITAR

Para contestar el comentario anterior. El @ activa el uso del resolutor de fábrica de beans para acceder a un bean; una alternativa es añadir un BeanExpressionContextAccessor al contexto de evaluación y utilizar un BeanExpressionContext como el objeto raíz de la evaluación ...

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

¿Puedo usar la expresión anterior sin el símbolo '@'? @ someOtherBean.getData() >> someOtherBean.getData(). – RiyasAbdulla

+0

No sin configuración adicional; ver la edición de mi respuesta. Realmente debería hacer una nueva pregunta: a los administradores aquí no les gustan las preguntas nuevas en los comentarios. –

1

favor, eche un vistazo @https://www.mkyong.com/spring3/test-spring-el-with-expressionparser/

código Java de ejemplo

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

    } 
} 
Cuestiones relacionadas