복붙노트

[SPRING] Spring Expression Language로 빈 표현식을 프로그래밍 방식으로 평가

SPRING

Spring Expression Language로 빈 표현식을 프로그래밍 방식으로 평가

간단한 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();

예외가 throw됩니다.

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

나는 루트 객체를 어떻게 든 설정하여 속성처럼 구성된 빈을 허용해야한다고 생각합니다. 하지만 아직 작동하지 않았습니다. 누구나 이미이 작업을 수행했으며 힌트를 줄 수 있습니까?

해결법

  1. ==============================

    1.BeanFactoryAware를 구현하여 Bean 팩토리에 대한 참조를 얻는다. 그때...

    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를 평가 컨텍스트에 추가하고 BeanExpressionContext를 평가 용 루트 객체로 사용하는 것입니다.

    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);
    
  2. ==============================

    2.@ https://www.mkyong.com/spring3/test-spring-el-with-expressionparser/을 (를)보십시오.

    @ https://www.mkyong.com/spring3/test-spring-el-with-expressionparser/을 (를)보십시오.

    샘플 자바 코드

    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);
    
        }
    }
    
  3. from https://stackoverflow.com/questions/11616316/programmatically-evaluate-a-bean-expression-with-spring-expression-language by cc-by-sa and MIT license