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

松散绑定不适用于具有自定义系统环境属性源的组合@ConfigurationProperties名称

彭飞虎
2023-03-14

我有一个带有环境变量的外部属性源(比如一个. properties文件),如下所示:

MY_PROP1=1A
MY_PROPS_PROP1=1B
MY_PROPOBJ_PROP1=1C

我想用这些初始化一个< code > @ configuration properties :

@ConfigurationProperties("my")
@Setter
@Getter
class MyProperties {

    private String prop1;
    private Props props = new Props();
    private PropsObj propsObj = new PropsObj();

    @Setter
    @Getter
    class Props {
        private String prop1;
    }

    @Setter
    @Getter
    class PropsObj {
        private String prop1;
    }
}

当我在应用程序开始时将这些设置为环境变量时,一切都很好。但是,当我在EnvironmentPostProcessor中使用自定义SystemEnvironment PropertySource处理这些对象时,组合对象 prop1的属性未解析(值为 null):

class MyEnvPostProcessor implements EnvironmentPostProcessor {
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment env, SpringApplication app) {
        env.getPropertySources().addLast(
            new SystemEnvironmentPropertySource(
                "myPropertySource1",
                // simplified, the map will be filled from a properties file etc:
                Map.of("MY_PROP1", "1A", "MY_PROPS_PROP1", "1B", "MY_PROPOBJ_PROP1", "1C")));
    }
}

为什么在这种情况下,放松绑定不起作用?

我用的是Spring Boot 2.2.2.RELEASE


共有1个答案

法池暝
2023-03-14
匿名用户

问题在于Spring用来解析属性名的映射。对于环境变量,必须使用< code > SystemEnvironmentPropertyMapper 才能按预期工作。

此映射器将属性名称映射到可能的候选项中:< code > MY _ probj _ PROP1 ,< code>MY_PROP_OBJ_PROP1,< code>my.prop-obj.prop1,而默认映射器仅生成< code>my.prop-obj.prop1。由于在您的自html" target="_blank">定义属性源中找不到< code>my.prop-obj.prop1,因此不会解析该值。

要提示Spring为环境属性使用正确的映射器,属性源名称必须分别以-systemEnvironment结尾。使用StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME。按如下方式编辑代码:

environment.getPropertySources().addAfter(
    StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
    new SystemEnvironmentPropertySource(
        "myPropertySource-" + StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
        Map.of("MY_PROPOBJ_PROP1", "MyValue1")));

 类似资料:
  • 我想通过使用@ConfigurationProperties注释将我的Application.Properties自动绑定到一个类中。首先,我尝试了@value注释,并能够将属性值注入类变量。但是,@ConfigurationProperties没有将属性注入到值中。 我的应用程序.属性: application.java ConfigBinder.java 输出: 这样的执行到底出了什么问题?

  • 我感兴趣的是创建一个或多个自定义属性源加载器,并在我的应用程序中使用那些带有的属性源。 例如,我想开发一个属性源加载器,它能够加载XML文件并将其转换成一组属性,这些属性可以注入到我的< code>@Configuration注释类中。 是否有任何此类基于 XML 的属性源加载程序公开可用?如果没有,那么一旦我实现了它,我将如何将其提供给我的应用程序? 谢谢。

  • 本文向大家介绍aurelia 创建具有可绑定属性的自定义元素,包括了aurelia 创建具有可绑定属性的自定义元素的使用技巧和注意事项,需要的朋友参考一下 示例 创建具有可绑定属性的自定义元素非常简单。如果要创建一个接受一个或多个插件可以使用的值的元素,则需要使用@bindable装饰器和语法。 在下面,我们正在创建一个自定义元素,该元素接受一系列水果并显示它们。 示例: my-element.j

  • 我们正在使用Spring数据,并试图创建一个带有子查询的自定义查询,结果投影有一个数组和其他属性,我们的问题是子查询数组。 预测如下:

  • 问题内容: 我正在使用JavaScriptSerializer反序列化json数据。一切工作都很好,但是我的问题是,json数据中的一个属性被命名为“ base”,所以我无法在C#代码中创建这样的属性。我发现我可以手动将值映射到构造函数中的属性,但是问题是,我的DTO具有200个属性,因此我不想手动进行此操作,而是希望找到任何其他解决方案。我也尝试使用注释,但这是: 并没有帮助我,每次将baseV