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

2024-03-17

长话短说:

有没有办法解释由以下结果产生的字符串${my.property}作为一个 SpEL 表达式@Value不使用转换器的注释,例如就像是@Value("#{${my.property}})?


我有一个抽象工厂(简化的),可以让我构建一些公共对象,这些对象是我的系统配置的一部分。

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

为了更灵活,我想让用户在中编写SpEL表达式app.properties文件,以便可以直接访问工厂:

my.property = @Factory.makeVal(12)

现在,在需要此属性的类中,为了实现我的目标,我编写了以下代码。

@Value("#{${my.property}}")
private Product obj;

我以为${my.property}将被宏观展开,然后由#{}作为相应的 SpEL 表达式,@Factory.makeVal(12)在上面的例子中。不幸的是,情况并非如此,加载 Spring 上下文会导致错误,指出它无法转换字符串(属性的值${my.property}) 到目标类型Product.

现在,我通过编写一个类来解决这个问题Converter<String, Product>,但它非常复杂,因为我需要通过实例化以编程方式将字符串评估为 SpEL 表达式ExpressionParser等等。

但有没有更简单的解决方案呢?是否有一个单一的 SpEL 表达式可以放入@Value让我简单评估的注释${my.property}作为 SpEL 表达式本身,可以吗?


也许只是更换的问题@Factory with 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;
        }
    }
}    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 ${my.property} 计算为 @Value 注释中的 SpEL 表达式 的相关文章

随机推荐

  • 使用 ASP.NET 5 中的默认 DI 容器一次性注册所有服务,类似于 Autofac

    对于 ASP NET 5 已经默认提供了一个 DI 它看起来很有趣 我一直在使用 Autofac 和 MVC 5 它可以选择一次注册所有程序集 下面是在 Autofac 中注册所有以 Service 结尾的类的示例代码 Autofac Co
  • React 和 Typescript 与 webpack 打字问题

    我正在尝试创建一个asyncComponent使用 TypeScript 构建高阶组件 但无法完全获得正确的类型 本质上 这可以在 JS 和 webpack 中工作 const Auth asyncComponent gt require
  • 在 ASP.NET MVC3 RC2 中显示复杂类型

    我有一个使用复杂类型作为属性的模型 namespace Web Models public class Business IModel Key HiddenInput DisplayValue false public Guid ID ge
  • 如何查询从 varchar 类型获取最大 id 和数字中的值?

    我有表和列 ID 值为 1 2 3 10 11 12 13 如何查询 varchar 类型的最大 id 我曾尝试过 select MAX id from table 但结果是9 请帮忙 看起来这些值是字符串 它选择最大的字符串 如果您希望它
  • 将 SQLite 设置为 Laravel 5.1 中单元测试的数据库

    我正在尝试在 Laravel 5 1 中设置单元测试 继文档 http laravel com docs 5 1 testing我看到这个 Laravel 在构建时就考虑到了测试 其实支持测试 PHPUnit 是开箱即用的 and 运行测试
  • CSS Div 背景图像固定高度 100% 宽度

    我正在尝试设置一系列具有背景图像的 div 每个 div 都有自己的固定高度 并拉伸以填充宽度 即使顶部 底部被剪切的溢出也是如此 我只是不想要边缘有空白 目前 我有 http jsfiddle net ndKWN http jsfiddl
  • 如何获取java中创建的日期图片

    我想提取 jpg 文件的创建日期 Java 有 File 对象的 lastModified 方法 但似乎不支持从文件中提取创建日期 我相信这些信息存储在文件中 因为当我将鼠标指针悬停在 Win XP 中的文件上时看到的日期与我在 DOS 中
  • 派生类的成员函数是否继承了基类的虚拟性?

    假设我们有以下两个类 A 是具有虚拟析构函数的基类 B 是其析构函数没有 virtual 限定符的派生类 我的问题是 如果我要从 B 派生更多类 B 的析构函数是否会自动继承虚拟性 或者我需要在 B class A public A std
  • Heroku 已成功部署,但我仍然没有运行任何 Web 进程

    我正在尝试将电报机器人推入 Heroku 这些是我的文件夹中的文件 new bot requirements txt Procfile worker python new bot py init py empty new bot py en
  • Zend Framework 路由:参数数量未知

    我正在尝试为 N 级类别深度编写一条路线 因此 通常的类别 URL 如下所示 http website my category my subcategory my subcategory level3 my subcategory leve
  • (UWP) 将网格另存为 png

    我正在开发一个 UWP 应用程序 它有一个带有子项 图像和文本块的网格 我有两件事想要实现并需要帮助 如何使用预定义名称将 Grid 元素及其子内容作为图像 最好是 PNG 保存在本地文件夹中 如何检索此保存的图像 然后将其作为附件与其他兼
  • 为什么这个简单的连接查询使用子查询会明显更快?

    我有两张桌子 order details这是 100 000 行 并且outbound即 10 000 行 我需要加入他们的专栏order number 两者都是 VARCHAR 50 order number 在出站表中不唯一 CREAT
  • 如何根据返回值执行不同的查询?

    我有一个足球比赛列表 定义如下 id datetime status gameweek round id home team id 1 2019 03 31 00 00 00 1 29 12696 1243 2 2019 03 31 00
  • 如何在Python中获取所有直接子目录

    我正在尝试编写一个简单的Python脚本 它将所有子目录中的index tpl复制到index html 有一些例外 我因尝试获取子目录列表而陷入困境 import os def get immediate subdirectories a
  • 在两个不同的头文件中的两个结构中包含循环依赖项是否错误?

    我有一个非常大的程序无法编译 我怀疑它与跨结构的循环依赖关系有关 当我像下面这样编码时 它不会编译 foo h ifndef FOO define FOO include bar h typedef struct foo Foo struc
  • 创建模型时用 laravel 返回模型

    我需要将保存为 json 的新模型发送到前面 但我看不到响应中的列organizationid 这是我的模型 class Organization extends Model protected table core organizatio
  • 强制纵向模式

    好吧 由于没有人回答我之前的问题 我开始相信可能没有简单的方法可以做到这一点 但我很乐观 这是我的问题 在我的应用程序中 我使用常规 UIButton 从 ViewControllerOne 切换到 ViewControllerTwo Vi
  • 用于动态创建元素的 jQuery CSS()

    我正在使用 jQuery CSS 函数来设置一些元素的样式 element css style 这是可行的 但部分元素是在页面加载后动态创建的 这应该是 element live created function this css styl
  • Code First 一对多关系的多个外键

    我在使用 Entity Framework 6 Code First Fluent API 时遇到了一些不符合惯例的问题 一个典型的例子是我有一个名为软件的实体 我不希望数据库表被称为 Softwares 它应该被称为软件 但也有一些其他的
  • 将 ${my.property} 计算为 @Value 注释中的 SpEL 表达式

    长话短说 有没有办法解释由以下结果产生的字符串 my property 作为一个 SpEL 表达式 Value不使用转换器的注释 例如就像是 Value my property 我有一个抽象工厂 简化的 可以让我构建一些公共对象 这些对象是