【问题标题】:Using Spring internal Spel Expression Parser使用 Spring 内部 Spel 表达式解析器
【发布时间】:2017-07-20 21:26:12
【问题描述】:

你知道如何使用 Spring 内部 Spel Expression Parser 来解析包含 Spring Application Context 的 bean 引用的字符串吗?

我已经看到 SpelExpressionParser 可以与定义一些显式用户变量的 StandardEvaluationContext 一起使用。

我正在寻找一种直接使用 Spring 内部 Spel Expression Parser 绑定到整个 Spring Application Context 的解决方案。这个想法是使用具有 @Value SPEL 注释相同功能的字符串模板。

【问题讨论】:

    标签: spring spring-el


    【解决方案1】:

    您可以使用EmbeddedValueResolver 来实现与@Value 注释相同的功能:

    // can be autowired or fetched from ConfigurableApplicationContext.getBeanFactory()
    ConfigurableBeanFactory configurableBeanFactory; 
    
    EmbeddedValueResolver embeddedValueResolver = new EmbeddedValueResolver(configurableBeanFactory);
    System.out.println(embeddedValueResolver.resolveStringValue("${someProperty}");
    System.out.println(embeddedValueResolver.resolveStringValue("#{@foo.calcValue(123)}");
    

    【讨论】:

      【解决方案2】:

      我通过使用找到了解决方案:

      private Object resolveExpression(String expression) {
          String placeholdersResolved = applicationContext.getBeanFactory().resolveEmbeddedValue(expression);
          BeanExpressionResolver expressionResolver = applicationContext.getBeanFactory().getBeanExpressionResolver();
          return expressionResolver.evaluate(placeholdersResolved, new BeanExpressionContext(applicationContext.getBeanFactory(), null));
      }
      

      resolveEmbeddedValue 用属性占位符替换 ${} 表达式。

      使用 Application Context Bean Factory 评估 resolve #{} 表达式

      【讨论】:

        【解决方案3】:
        public class CustomClass{
            @Autowired
            private ConfigurableApplicationContext configurableApplicationContext;
        
            public String evaluateExpression(String myString) {
                ConfigurableListableBeanFactory beanFactory =
                      configurableApplicationContext.getBeanFactory();
                  StringValueResolver str = new EmbeddedValueResolver(beanFactory);
                  return str.resolveStringValue(myString);
                  //Put Above statement in Try catch .. Worked for me
            }
        }
        

        它适用于任何环境变量 示例


        application.properties

        data.myenv=10


        /etc/profile

        导出 DATA_MYENV=10

        【讨论】:

          猜你喜欢
          • 2016-06-27
          • 2012-05-24
          • 2011-09-29
          • 2019-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-14
          • 1970-01-01
          相关资源
          最近更新 更多