Spring 引导:具有不同前缀的多个相似 ConfigurationProperties

Spring Boot: Multiple similar ConfigurationProperties with different Prefixes

我正在使用 Spring Boot 并有两个非常相似的服务,我想在 application.yml.

中配置它们

配置大致如下:

serviceA.url=abc.com
serviceA.port=80

serviceB.url=def.com
serviceB.port=8080

是否可以创建一个用 @ConfigurationProperties 注释的 class 并在注入点设置前缀?

例如

@Component
@ConfigurationProperties
public class ServiceProperties {
   private String url;
   private String port;

   // Getters & Setters
}

然后在服务本身中:

public class ServiceA {

   @Autowired
   @SomeFancyAnnotationToSetPrefix(prefix="serviceA")
   private ServiceProperties serviceAProperties;

   // ....
}

很遗憾,我没有在文档中找到有关此类功能的信息...非常感谢您的帮助!

@ConfigurationProperties注解有设置前缀配置的字段。这是我的例子:

@Component
@ConfigurationProperties(prefix = "b2gconfig")
public class B2GConfigBean {
    private  String account;

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    private  String key;
}

还有我的 application.properties 文件:

我实现了与您尝试的几乎相同的目标。 首先,注册每个属性 bean。

@Bean
@ConfigurationProperties(prefix = "serviceA")
public ServiceProperties  serviceAProperties() {
    return new ServiceProperties ();
}

@Bean
@ConfigurationProperties(prefix = "serviceB")
public ServiceProperties  serviceBProperties() {
    return new ServiceProperties ();
}

并在服务(或将使用属性的某个地方)放置一个@Qualifier 并指定哪个 属性 将被自动连接。

public class ServiceA {
    @Autowired
    @Qualifier("serviceAProperties")
    private ServiceProperties serviceAProperties;

}

JavaBean 验证除外,JavaBean 示例运行完美。

我在其中一个属性上添加了 @NotNull 注释:

public class ServiceProperties {
   @NotNull
   private String url;
   private String port;

   // Getters & Setters

}

因此,应用程序启动失败并显示以下错误消息:

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target ch.sbb.hop.commons.infrastructure.hadoop.spark.SparkJobDeployerConfig@730d2164 failed:

    Property: url
    Value: null
    Reason: may not be null


Action:

Update your application's configuration

删除注释后,应用程序以正确的 属性 绑定启动。 总之,我认为 JavaBean Validation 没有获得正确初始化的实例存在问题,可能是因为配置方法缺少代理。

按照这个 post Guide to @ConfigurationProperties in Spring Boot 你可以创建一个简单的 class 没有注释:

public class ServiceProperties {
   private String url;
   private String port;

   // Getters & Setters
}

然后使用@Bean 注释创建@Configuration class:

@Configuration
@PropertySource("classpath:name_properties_file.properties")
public class ConfigProperties {

    @Bean
    @ConfigurationProperties(prefix = "serviceA")
    public ServiceProperties serviceA() {
        return new ServiceProperties ();
    }

    @Bean
    @ConfigurationProperties(prefix = "serviceB")
    public ServiceProperties serviceB(){
        return new ServiceProperties ();
    }
}

最终可以得到如下属性:

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    private ConfigProperties configProperties ;

    private void watheverMethod() {
        // For ServiceA properties
        System.out.println(configProperties.serviceA().getUrl());

        // For ServiceB properties
        System.out.println(configProperties.serviceB().getPort());
    }
}