Spring Boot 3 - 属性绑定到 Map “duplicates” 键

Spring Boot 3 - property binding into Map "duplicates" keys

提问人:Antonio Soldo 提问时间:11/9/2023 更新时间:11/9/2023 访问量:25

问:

我正在使用 Spring Boot 3.1.4(也在 3.0.5 上进行了测试),并注意到一些导致下游问题的东西。我不确定这是SpringBoot中的错误还是我这边的误用(如果是这样,请告知应该采用哪种适当的方式)

我有一个多租户应用程序,我需要为每个租户配置 DataSource。为此,我使用了 autowiring bean 下的配置属性。 当我尝试获取在它们下定义的所有 XA 数据源属性时,它们将被映射到(因此,例如,如果我在其中定义属性,则将映射到映射为 )。spring.datasourceDataSourcePropertiesspring.datasource.xa.propertiesMap<String, String>spring.datasource.xa.properties.my-first-property=firstValueapplication.propertiesmy-first-property:firstValue

当所有属性都是只读时,就没有问题了。application.properties

有趣的是,当我通过环境变量覆盖一些配置属性时(例如,当我将应用程序部署到 Kubernetes 集群时就是这种情况)。通过环境变量定义的属性的定义完全符合SpringBoot在宽松绑定部分中的建议。

发生这种情况时,我在映射中得到“重复”键 - 一个键来自并按原样映射(camelCase 或 kebab-case,配置文件中定义的任何内容),另一个都是小写的,没有破折号。但是这两个键都有在环境变量中定义的值(应该如此)。application.properties

因此,例如,如果我在参数中定义并且我还定义了环境变量,因为我在 map 中有两个条目 - 并且 ,它们都具有值。application.propertiesspring.datasource.xa.properties.my-first-property=firstValueSPRING_DATASOURCE_XA_PROPERTIES_MYFIRSTPROPERTY=newValuemy-first-valuemyfirstvaluenewValue

我将分享演示此类行为的相关类:

@Configuration
public class MySimpleConfiguration {


    @Autowired
    DataSourceProperties dataSourceProperties;

    @Bean
    public String myDummyBean() {
        Map<String, String> xaProperties = dataSourceProperties.getXa().getProperties();

        System.out.println("XA PROPERTY:\n" + xaProperties);
        
        return "myDummyBean";
    }
}
spring.datasource.xa.properties.my-first-property=firstValue
spring.datasource.xa.properties.my-second-property=secondValue

我通过IntelliJ IDEA运行它,配置如下:https://i.stack.imgur.com/yrzAL.png

运行时我得到的日志是:

2023-11-09 12:02:47,320 [,] DEBUG o.s.b.f.s.DefaultListableBeanFactory Creating shared instance of singleton bean 'myDummyBean'
XA PROPERTY:
{myfirstproperty=newFirstValue, my-first-property=newFirstValue, my-second-property=secondValue}

我希望环境变量的值被覆盖,但只有一个键存在 - 一个包含在配置文件中的键。Mapapplication.properties

为什么这会给我带来麻烦?当我提取所有 XA 属性并将它们传递给实际的数据库驱动程序(在我的情况下是 IBM DB2 驱动程序)时,参数的自动绑定失败,但没有匹配的键,所有小写字母都没有破折号。我通过从地图中显式删除这些属性来克服这个问题,但同样,为什么它们首先会“重复”?

spring-boot 配置 属性绑定

评论


答: 暂无答案