提问人:Antonio Soldo 提问时间:11/9/2023 更新时间:11/9/2023 访问量:25
Spring Boot 3 - 属性绑定到 Map “duplicates” 键
Spring Boot 3 - property binding into Map "duplicates" keys
问:
我正在使用 Spring Boot 3.1.4(也在 3.0.5 上进行了测试),并注意到一些导致下游问题的东西。我不确定这是SpringBoot中的错误还是我这边的误用(如果是这样,请告知应该采用哪种适当的方式)
我有一个多租户应用程序,我需要为每个租户配置 DataSource。为此,我使用了 autowiring bean 下的配置属性。
当我尝试获取在它们下定义的所有 XA 数据源属性时,它们将被映射到(因此,例如,如果我在其中定义属性,则将映射到映射为 )。spring.datasource
DataSourceProperties
spring.datasource.xa.properties
Map<String, String>
spring.datasource.xa.properties.my-first-property=firstValue
application.properties
my-first-property:firstValue
当所有属性都是只读时,就没有问题了。application.properties
有趣的是,当我通过环境变量覆盖一些配置属性时(例如,当我将应用程序部署到 Kubernetes 集群时就是这种情况)。通过环境变量定义的属性的定义完全符合SpringBoot在宽松绑定部分中的建议。
发生这种情况时,我在映射中得到“重复”键 - 一个键来自并按原样映射(camelCase 或 kebab-case,配置文件中定义的任何内容),另一个都是小写的,没有破折号。但是这两个键都有在环境变量中定义的值(应该如此)。application.properties
因此,例如,如果我在参数中定义并且我还定义了环境变量,因为我在 map 中有两个条目 - 并且 ,它们都具有值。application.properties
spring.datasource.xa.properties.my-first-property=firstValue
SPRING_DATASOURCE_XA_PROPERTIES_MYFIRSTPROPERTY=newValue
my-first-value
myfirstvalue
newValue
我将分享演示此类行为的相关类:
@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}
我希望环境变量的值被覆盖,但只有一个键存在 - 一个包含在配置文件中的键。Map
application.properties
为什么这会给我带来麻烦?当我提取所有 XA 属性并将它们传递给实际的数据库驱动程序(在我的情况下是 IBM DB2 驱动程序)时,参数的自动绑定失败,但没有匹配的键,所有小写字母都没有破折号。我通过从地图中显式删除这些属性来克服这个问题,但同样,为什么它们首先会“重复”?
答: 暂无答案
评论