2012-07-23 42 views
9

Tôi có một đơn giản biểu thức mùa xuân Bean, giúp đánh giá tốt khi tôi định nghĩa nó bên trong một tập tin bối cảnh ứng dụng:lập trình đánh giá một biểu thức đậu với mùa xuân Expression Language

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

Bây giờ, tôi muốn làm việc đánh giá cùng một lập trình . Tôi đã sử dụng đoạn mã sau:

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

này ném một ngoại lệ:

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

Tôi đoán tôi phải thiết lập một đối tượng gốc bằng cách nào đó cho phép cho đậu được cấu hình như một tài sản. Nhưng tôi đã không làm cho nó hoạt động được. Bất cứ ai, những người đã làm điều này đã và có thể đưa ra một gợi ý?

Trả lời

7

triển khai BeanFactoryAware để tham chiếu đến nhà máy đậu; sau đó ...

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

Để trả lời các bình luận dưới đây. @ kích hoạt việc sử dụng trình phân giải nhà máy đậu để truy cập một bean; một sự thay thế là thêm một BeanExpressionContextAccessor với bối cảnh đánh giá và sử dụng một BeanExpressionContext như đối tượng gốc cho việc đánh giá ...

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

Tôi có thể sử dụng biểu thức trên mà không có biểu tượng '@' không? @ someOtherBean.getData() >> someOtherBean.getData(). – RiyasAbdulla

+0

Không có cấu hình bổ sung; xem chỉnh sửa cho câu trả lời của tôi. Bạn thực sự nên hỏi một câu hỏi mới - các quản trị viên ở đây không thích câu hỏi mới trong các bình luận. –

1

Hãy xem @https://www.mkyong.com/spring3/test-spring-el-with-expressionparser/

Mẫu mã 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); 

    } 
} 
Các vấn đề liên quan