有没有一种推荐的方法可以在外部化配置中引入重构/重命名,同时为仍然依赖旧配置结构的用户保持向后兼容性?
例如,给定一个库,它使用通过 @ConfigurationProperties
过去:
old-properties:
an:
old-property: true
another:
custom-property: 1234
该库的新版本将配置重新定义为:
my-library:
a-property: true
another-property: 1234
有没有一个好的方法来反对旧的结构,同时保持现有消费者的兼容性一段时间?使用新版本库的消费者应该仍然能够使用 old-properties.an.old-property
并将其自动Map到 my-library.a-property
.
我知道使用其他配置元数据将属性标记为已弃用的功能,但我正在明确地寻找支持这两个版本的方法以简化迁移。
2条答案
按热度按时间jfgube3f1#
spring boot配置处理器提供
@DeprecatedConfigurationProperty
用于此目的的注解。生成的元数据文件将包含任何原因/替换注解,如果使用带注解的属性,则会记录相应的弃用警告。请参阅此处以获取基本示例,或cassandraproperties.java以获取实际用例。
对于未Map到
@ConfigurationProperties
您可以在中手动指定它们META-INF/additional-spring-configuration-metadata.json
(参考spring引导文档,这里有一个示例)。anauzrmj2#
我研究了springboot如何处理
logging.file
(替换为logging.file.name
)当他们直接在代码中实现回退时,我决定通过创建新的@ConfigurationProperties
在一个@Bean
方法,该方法处理从旧属性名(如果可用)设置值。考虑到新的配置结构如下所示(为了简洁起见,使用lombok):
这个
@Bean
方法现在负责读取旧值并将其应用于属性:如果新值也是通过config设置的,它将覆盖旧属性中设置的值。