我有一个大型的Spring网络应用程序,可以追溯到几年前。我需要将其更新为Spring Boot(公司要求)。我的方式很好 - 它开始(!),虽然注入属性有一些问题,导致应用程序失败。
具体来说,每个配置文件有三个巨大的配置文件,例如qa_config.properties
,qa_ehcache.xml
,qa_monitoring.properties
。目前我只关心qa_config.properties
,我已将其重命名为Spring Boot的首选名称application-qa.properties
和application-qa_monitoring.properties
应用程序有许多用@Named
注释的类(来自javax.ws.rs-api),这些类是早期加载的 - 所以我需要在构造函数中注入属性:
package com.domain.app;
import org.springframework.beans.factory.annotation.Value;
import javax.inject.Named;
@Named
public class Foo {
// Cant use @Value here, it is not yet in the context
protected String bar; // lives in application-qa.properties
protected String qux; // lives in application-qa_monitoring.properties
public Foo(@Value("${application.property.named.bar}") String bar,
@Value("${monitoring.property.named.qux}") String qux) {
this.bar = bar;
this.qux = qux;
doSomeWork();
}
}
属性文件:
#application-qa.properties
application.property.named.bar=something
和
#application-qa_monitoring.properties
monitoring.property.named.qux=another_thing
我的问题:我希望尽快在上下文中同时使用application-qa.properties
和application-qa_monitoring.properties
,并在 @Named
类之前加载。
为实现这一目标,我正在运行具有qa
的活动配置文件的应用程序,该配置文件成功地将该组属性添加到上下文中。
我将此行添加到application.properties
文件中,以确保加载其他属性:
spring.profiles.include=${spring.profiles.active}_monitoring.properties
当我运行Spring Boot应用程序时,输出告诉我
The following profiles are active: qa_monitoring.properties,qa
调试Foo
类时,bar
的值是正确的
但是,qux
的值为空。
我是否遗漏了有关加载属性文件的顺序的内容?我原本认为include
中的application.properties
行足以“平展”#34;这两个文件很早就开始了,如果一个是在上下文中,那么两者都应该可用吗?
我可以做的只是将两个属性文件中的所有变量扔到一个application-qa.properties
中,但如果可能的话,我希望保持它们分离并尽可能接近原始结构尽可能。
答案 0 :(得分:2)
感谢pvpkiran和Andy Brown。
我的application.properties文件应该已经读过
spring.profiles.include=${spring.profiles.active}_monitoring
即,只需添加另一个profile
,在这种情况下qa_monitoring
- Spring会自动添加application-
前缀和.properties suffix
答案 1 :(得分:0)
您遇到的问题是因为您在qux值的@Value注释中使用了文字值而不是查找键。
替换
public Foo(@Value("${application.property.named.bar}") String bar,
@Value("monitoring.property.named.qux") String qux) {
用
public Foo(@Value("${application.property.named.bar}") String bar,
@Value("${monitoring.property.named.qux}") String qux) {
它应该有用。