java—更改spring boot外部化配置时的向后兼容性

q35jwt9p  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(552)

有没有一种推荐的方法可以在外部化配置中引入重构/重命名,同时为仍然依赖旧配置结构的用户保持向后兼容性?
例如,给定一个库,它使用通过 @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 .
我知道使用其他配置元数据将属性标记为已弃用的功能,但我正在明确地寻找支持这两个版本的方法以简化迁移。

jfgube3f

jfgube3f1#

spring boot配置处理器提供 @DeprecatedConfigurationProperty 用于此目的的注解。生成的元数据文件将包含任何原因/替换注解,如果使用带注解的属性,则会记录相应的弃用警告。
请参阅此处以获取基本示例,或cassandraproperties.java以获取实际用例。
对于未Map到 @ConfigurationProperties 您可以在中手动指定它们 META-INF/additional-spring-configuration-metadata.json (参考spring引导文档,这里有一个示例)。

anauzrmj

anauzrmj2#

我研究了springboot如何处理 logging.file (替换为 logging.file.name )当他们直接在代码中实现回退时,我决定通过创建新的 @ConfigurationProperties 在一个 @Bean 方法,该方法处理从旧属性名(如果可用)设置值。
考虑到新的配置结构如下所示(为了简洁起见,使用lombok):

import lombok.Data;

@Data
public class MyLibraryConfigurationProperties {

    private String aProperty;
    private String anotherProperty;

}

这个 @Bean 方法现在负责读取旧值并将其应用于属性:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@Configuration
public class MyLibraryConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "my-library")
    public MyLibraryConfigurationProperties myLibraryConfigurationProperties(Environment environment) {
        MyLibraryConfigurationProperties config = new MyLibraryConfigurationProperties();

        // fallback to old property if available
        if (environment.containsProperty("old-properties.an.old-property")) {
            // here we could also log warnings regarding the deprecation
            config.setAProperty(environment.getProperty("old-properties.an.old-property"));
        }

        return config;
    }
}

如果新值也是通过config设置的,它将覆盖旧属性中设置的值。

相关问题