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

如何重写PropertySourcesPropertyResolver并将其他属性源添加到Externalized配置

邬朗
2023-03-14

有没有办法通过添加额外的属性源来覆盖Spring Boot的PropertySourcesPropertyResolver并扩展Externalize配置?

我试图做的是在当前列表中添加另一个属性源,并能够使用当前机制覆盖此属性。为了扩展PropertySourcesPropertyResolver,因此当Spring映射用@ConfigurationProperties注释的类的属性并请求密钥时,它可以检查具有两个不同前缀的密钥。

例如,如果我有来自两个不同位置的属性:

位置1上的属性:data.user=userName

位置 2 上的属性:服务.data.用户= 服务用户名

我希望能够用service.data.user的值覆盖data.user的值(如果该属性存在)。

共有2个答案

澹台展鹏
2023-03-14

来自: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/PlaceholderConfigurerSupport.html#DEFAULT_VALUE_SEPARATOR

具有默认值的XML属性示例:

 <property name="url" value="jdbc:${dbname:defaultdb}"/>

但是,似乎有一些人在使用多个属性占位符时遇到了问题,因此您可能需要注意:

    < li >有没有办法在Spring XML中指定默认属性值? < li >未找到具有多个上下文的属性:属性-占位符

另一种方法是为您的data.user属性提供默认值,并让人们根据需要覆盖它。

程振濂
2023-03-14

只是为了与他人分享,也许有人觉得这很有用。

整个解决方案与扩展PropertySourcesPlaceholderConfigure的bean相关。

  1. 部分是将另一个属性源添加到现有的属性源列表中。在我的情况下,我需要存储在某个jar文件中的应用程序属性。

为此,我们有JarPropertiesPropertySource:

public class JarPropertiesPropertySource extends MapPropertySource implements Logger {

    @SuppressWarnings({"unchecked", "rawtypes"})
    public JarPropertiesPropertySource(String name, Properties source) {
        super(name, (Map) source);
    }

    protected JarPropertiesPropertySource(String name, Map<String, Object> source) {
        super(name, source);
    }    
}

主要逻辑是在 自定义属性源占位符配置器 bean 中:

public class CustomPropertySourcesPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer implements Logger {

    @Override
    public PropertySources getAppliedPropertySources() throws IllegalStateException {
        final MutablePropertySources mps = new MutablePropertySources();

        // Get existing PropertySources
        PropertySources ps = super.getAppliedPropertySources();        
        ps.forEach(propSource -> mps.addLast(new PropertySourceProxy(propSource)));

        // Add JAR property source
        mps.addLast(new JarPropertiesPropertySource("jar", ....))

        return mps;
    }
}

.

public class PropertySourceProxy extends PropertySource {

    public PropertySourceProxy(PropertySource propertySource) {
        super(propertySource.getName(), propertySource.getSource());
        Object o = propertySource.getSource();
        if (o instanceof StandardEnvironment) {
            ConfigurableEnvironment ce = (ConfigurableEnvironment) o;
            MutablePropertySources cemps = ce.getPropertySources();
            cemps.forEach(propSource -> {
                cemps.replace(propSource.getName(), new PropertySourceProxy(propSource));
            });
        }
    }

    @Override
    public Object getProperty(String name) {
        Object value = null;

        if (name != null) {
            int index = name.indexOf("|");
            if (index != -1) {
                String newName = name.substring(index + 1);
                value = super.getProperty(newName);
            }
        }

        if (value == null)
            value = super.getProperty(name);

        return value;
    }
}
 类似资料:
  • 我有一个包,它使用一个配置文件具有一个属性: 我使用ConfigAdmin的蓝图如下所示: 只要我可以更改属性的值并且包自动更新属性,这就很好。 我想知道是否有任何方法可以在不更改蓝图的情况下将新属性添加到我的配置文件中(这涉及再次编译/打包)。当然,我的包应该准备好处理新属性。 不确定这在OSGi是否有意义。谁能给我一点提示,告诉我如何向现有配置文件动态添加新属性,并使它们在ConfigAdmi

  • 问题内容: 如何添加到特定内容?不起作用。 问题答案: jQuery <1.9 jQuery 1.9以上

  • 问题内容: 如何控制转盘中包含哪些文件?似乎没有被使用。 更新 : 我错了从源tarball安装与安装轮子之间的区别。源代码发行版包含中指定的文件,但已安装的软件包仅包含python文件。无论是通过源分发版,egg还是wheel安装,都需要采取步骤来确定应安装的其他文件。即,其他软件包文件需要package_data,而软件包外部文件(例如命令行脚本或系统配置文件)需要data_files。 原始

  • 问题内容: 我有两个实体,消息和用户。用户与消息有一个ManyToMany关系(一个用户可以有多个消息),而消息(现在,为了使其不那么复杂)与用户有一个ManyToMany关系(可以将一条消息发送给多个用户)。 我正在使用@JoinTable加入这两个实体,但是,我想在连接表中添加一个“状态”列,以告知该消息是否是新消息,已读消息等。我当时正在考虑将该列放入Message实体中,但是,我认为这可能

  • 问题内容: 我想在Python中创建一个动态对象(在另一个对象内部),然后向其添加属性。 我试过了: 但这没用。 有任何想法吗? 编辑: 我正在从循环遍历值列表的循环中设置属性,例如 在上面的例子中,我会得到,,。 我使用该函数是因为我不知道如何从循环中进行操作。 如何根据上例中的值设置属性? 问题答案: 您可以使用我古老的Bunch配方,但是如果您不想创建“绑定类”,则Python中已经存在一个

  • 我想在我的< code >上添加属性 似乎路线路径确实与问号混淆了。如果我把它换成其他东西,比如一个符号戳,它就会“起作用”。然而,这不是我想要的格式。我想要常规的<代码> 我找不到关于如何使这样的东西工作的文档。我看到了一些关于url的部分的东西,但我不太理解它。 谢谢你的所有帮助