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());
}
}
我正在使用 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());
}
}