[SPRING] Spring Expression Language로 빈 표현식을 프로그래밍 방식으로 평가
SPRINGSpring 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.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.@ 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); } }
from https://stackoverflow.com/questions/11616316/programmatically-evaluate-a-bean-expression-with-spring-expression-language by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 데이터 Rest 컨트롤러 : @BasePathAwareController, @RepositoryRestController, @Controller 및 @RestController의 동작 및 사용법 (0) | 2019.03.27 |
---|---|
[SPRING] 최대 절전 모드로 C3P0의 스프링 구성? (0) | 2019.03.27 |
[SPRING] Jackson SerializationFeature.WRITE_DATES_AS_TIMESTAMPS가 봄에 타임 스탬프를 끄지 않습니다. (0) | 2019.03.27 |
[SPRING] Spring 주석을 사용하여 파일 속성 읽기 (0) | 2019.03.27 |
[SPRING] NULL을 반환하는 싱글 톤과 @Autowired (0) | 2019.03.27 |