当前位置: 首页 > 知识库问答 >
问题:

将${my.property}计算为@value注释中的SpEL表达式

俞俊逸
2023-03-14

长话短说:

是否有一种方法可以将${my.property}生成的字符串解释为@value注释中的SpEL表达式,而不使用转换器,例如@value(“#{${my.property}})?

@Component
public class Factory {
  public Product makeVal(int x) { return new Product(5); }
}
my.property = @Factory.makeVal(12)
@Value("#{${my.property}}")
private Product obj;

我认为${my.property}将被宏展开,然后由#{}计算为对应的SpEL表达式,上面示例中的@factory.makeval(12)。不幸的是,情况并非如此,加载Spring上下文会导致一个错误,说明它无法将字符串(属性的值${my.property})转换为目标类型product

现在,我通过编写一个实现转换器 的类来解决这个问题,但这非常复杂,因为我需要通过实例化ExpressionParser等以编程方式将字符串计算为SpEL表达式。

但是有没有更简单的解决方案呢?请问,是否有一个SpEL表达式可以放在@value注释中,让我简单地将${my.property}作为SpEL表达式计算?

共有1个答案

何向荣
2023-03-14

也许这只是将属性值中的@factory替换为factory的问题。这个测试对我来说是通过的:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { SpelTest.Config.class })
public class SpelTest
{
    @Value("#{${my.property}}")
    Product _product;

    @Test
    public void evaluating_spel_from_property_value() throws Exception
    {
        Assert.assertEquals(1234, _product.value);
    }

    @Component
    public static class Factory
    {
        public Product makeVal(int x) { return new Product(x); }
    }

    public static class Product
    {
        public final int value;

        public Product(final int value) { this.value = value; }
    }

    @Configuration
    @ComponentScan(basePackageClasses = SpelTest.class)
    public static class Config
    {
        @Bean
        public Factory factory() { return new Factory(); }

        @Bean
        public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
            final PropertySourcesPlaceholderConfigurer psc = new PropertySourcesPlaceholderConfigurer();
            final MutablePropertySources sources = new MutablePropertySources();
            sources.addFirst(new MockPropertySource()
                .withProperty("my.property", 
                          "factory.makeVal(1234)"));
            psc.setPropertySources(sources);
            return psc;
        }
    }
}    
 类似资料:
  • 问题内容: 我正在尝试使用SpEL根据我定义的一些规则将同一文档加载到不同的集合中。 因此,从我所拥有的开始: -首先文件: -秒我有应该提供集合名称的提供者bean: 问题是,当我尝试将文档插入应由提供程序生成的特定集合中时,我得到以下stacktrace: org.springframework.expression.spel.SpelEvaluationException:EL1057E :

  • 我是Spring新手,尝试在使用注释的控制器内使用注释注入一个字符串,并且我的字符串的值被评估为字符串,而不是属性文件内的值。 下面是我的控制器,带有我要注入的字符串“消息”。 我的应用程序上下文如下所示: 我的属性文件包含以下行: Spring必须在某个点上获取该值,因为每当我将更改为不在属性文件中的值(如)时,我都会得到一个异常。

  • 使用DevTools控制台的求值计算功能,探测页面上任何项的状态。 DevTools控制台允许您以特别的方式了解页面中项的状态。他可以计算JavaScript的任何表达式,控制台本身支持几个功能。 TL;DR 计算键入的表达式。 使用其中一个快捷方式选择元素。 使用 inspect()检查DOM元素和JavaScript对象。 使用$0 - 4访问最近选择的元素和对象。 操作表达式 在控制台中输入

  • 我试图用Spring框架构建一个控制台应用程序。 我有一个由注释的类: 和由注释的类 但是,当我在中定义属性并使用默认配置文件时,属性将被分配。

  • 主要内容:示例,SpEL对Bean定义的支持,SpEL中的运算符,SpEL中的变量Spring Expression Language(简称 SpEL)是一种功能强大的表达式语言,支持运行时查询和操作对象图 。表达式语言一般是用最简单的形式完成最主要的工作,以此减少工作量。 Java 有许多可用的表达式语言,例如 JSP EL,OGNL,MVEL 和 JBoss EL,SpEL 语法类似于 JSP EL,功能类似于 Struts2 中的 OGNL,能在运行时构建复杂表达式、存取