如何使用 Spring Boot 配置属性对属性进行分组
Posted
技术标签:
【中文标题】如何使用 Spring Boot 配置属性对属性进行分组【英文标题】:How to group properties with Spring Boot Configuration Properties 【发布时间】:2016-03-07 17:05:52 【问题描述】:根据 Spring Boot 文档,可以对属性进行分组,并且一个属性可能出现在多个组中。但是当我们创建一个用@ConfigurationProperties(prefix="test1") 标记的属性类时,组名将是前缀test1。现在,如果我有另一个属性类,例如前缀为“test2”,我怎么能说后者具有来自组 test1 的属性?
--- 更新 --- 添加了嵌套类,但它不起作用
@Configuration
@Profile("wmx")
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "myapp.wmx", locations = "classpath:application-wmx.properties", "classpath:myapp-env.properties")
public class WmxProperties
/**
* The WMX implementation to be loaded.
*/
@NotNull(message = "Must be configured.")
private ProfileEnum profile;
//@ConfigurationProperties(locations = "classpath:myapp-env.properties")
public static class Env
/**
* Host name for WMX.
*/
private String host;
/**
* Port number for WMX.
*/
//@Pattern(regexp = "^[1-9]\\d*$", message = "Positive port number only.")
private Integer port;
/**
* Provider name.
*/
@NotBlank
private String providerName;
public String getHost()
return host;
public void setHost(String host)
this.host = host;
public Integer getPort()
return port;
public void setPort(Integer port)
this.port = port;
public String getProviderName()
return providerName;
public void setProviderName(String providerName)
this.providerName = providerName;
public ProfileEnum getProfile()
return profile;
public void setProfile(ProfileEnum profile)
this.profile = profile;
内部类上的注释注释@ConfigurationProperties 是在我的测试失败后完成的。 Spring 不会加载带有或不带有注释的那些属性,除非它们在同一个属性文件中,在本例中为 application-emx.properties。这是为什么?我想把这些属性分开
=== 已解决 ==== 我注意到我必须使用 getter/setter 方法添加嵌套类类型的字段,否则 Spring 不会加载嵌套类中的属性
【问题讨论】:
我不确定你有什么属性。您能否举例说明您的属性以及到目前为止您对 ConfigurationProperties 的尝试? 【参考方案1】:您可以借助内部类来组合它们:
属性文件
test1.property1=...
test1.test2.property2=...
test1.test2.property3=...
Java/Spring 映射:
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Getter
@Setter
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(locations = "classpath:myapp.properties")
public class ApplicationProperties
private String property1;
private Test2 test2;
@Getter
@Setter
@ConfigurationProperties(prefix = "test2")
public static class Test2
@NotNull
private String property2;
@NotNull
private String property3;
我们用这种方法取得了成功,因为 java 组合模仿了属性文件的结构。属性也是可验证的,因此如果配置不正确,您可能会很快失败。
这种方法的缺点是属性是可变的。
如果您的属性文件变得太大,您的应用程序很可能存在更广泛的问题。
【讨论】:
谢谢。这很好,但如果 Test2 属性与 Test1 没有直接关系怎么办。因此,出于文档原因,我们希望将它们分组。例如,一组用于 RabbitMQ 配置的属性和另一组用于回调机制的属性。现在每个集合都有一个 url 属性,希望它们被分组到环境属性中。我们希望使用这种格式为我们的客户生成文档 只是好奇,你能在编译时验证属性吗?我添加了 spring-boot maven 插件,但它不验证属性并且验证发生在部署时。 在编译时验证属性对我来说没有意义。如果你的属性在编译后不会改变,为什么要外部化它们呢? 很多现代云环境强烈推荐这个:12factor.net/config。这就是编译时验证没有意义的原因。【参考方案2】:注解处理器自动将内部类视为嵌套属性。确保定义了 getter 和 setter。
@ConfigurationProperties(prefix="server")
public class ServerProperties
private String name;
private Host host;
// ... getter and setters !!!
public static class Host
private String ip;
private int port;
// ... getter and setters !!!
使用非内部类也可以达到相同的效果,但您应该在字段上使用@NestedConfigurationProperty 注释来指示应将常规(非内部)类视为嵌套类。
@ConfigurationProperties(prefix="server")
public class ServerProperties
private String name;
@NestedConfigurationProperty
private Host host;
// ... getter and setters !!!
public class Host
private String ip;
private int port;
// ... getter and setters
【讨论】:
以上是关于如何使用 Spring Boot 配置属性对属性进行分组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Spring Boot和嵌入式Tomcat配置此属性?
如何使用 Spring Boot 和嵌入式 Tomcat 配置此属性?
如何根据 Spring Boot 中的活动配置文件设置注释属性值?