26

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

配置大致如下:

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

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

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

例如

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

   // Getters & Setters
}

然后在服务本身:

public class ServiceA {

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

   // ....
}

不幸的是,我没有在文档中找到有关此类功能的内容...非常感谢您的帮助!

4

4 回答 4

27

我实现了与您尝试的几乎相同的事情。首先,注册每个属性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;

}
于 2018-03-22T07:46:24.120 回答
8

按照这篇Spring Boot 中的 @ConfigurationProperties 指南,您可以创建一个没有注释的简单类:

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

   // Getters & Setters
}

然后使用@Bean 注解创建@Configuration 类:

@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());
    }
}
于 2019-11-21T11:03:18.317 回答
0

除了 JavaBean Validation 之外,Javvanos 示例运行良好。

我在其中一个属性上有注释 @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 没有获得正确初始化的实例存在问题,可能是因为配置方法上缺少代理。

于 2018-08-15T09:04:15.813 回答
-4

@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 文件: 在此处输入图像描述

于 2018-03-22T07:42:15.530 回答