我有一个Spring Boot应用程序。我有一个配置服务应用程序,它为我的应用程序提供所有配置。我创建了一个客户端,它提取应用程序的所有设置并将它们放入上下文中。 我创建了java类来完成这项工作:
@Configuration
public class ContextConfiguration {
@PostConstruct
public void getContextConfiguration(){
ConfigServiceResponse configurations = configurationServiceClient.getConfigurations(configurationEnv);
Properties properties = generateProperties(configurations.getConfigParameterList());
MutablePropertySources propertySources = env.getPropertySources();
propertySources.addFirst(new PropertiesPropertySource("APPLICATION_PROPERTIES", properties));
}
}
我还创建了用于配置DataSource的java类:
@Configuration
public class PersistentConfiguration {
@Value("${db.url}")
private String serverDbURL;
@Value("${db.user}")
private String serverDbUser;
@Value("${db.password}")
private String serverDbPassword;
public DataSource dataSource() {
return new SingleConnectionDataSource(serverDbURL, serverDbUser, serverDbPassword, true);
}
}
通过这种配置,App运行良好。直到我迁移到Spring Data。我刚刚将依赖项添加到Gradle配置中:
compile("org.springframework.boot:spring-boot-starter-data-jpa")
添加依赖项后,我可以在应用程序启动时看到异常:
使用名称' persistentConfiguration'创建bean时出错: 注入自动连接的依赖项失败;嵌套异常是 java.lang.IllegalArgumentException:无法解析占位符 ' db.url配置参数' in value" $ {db.url}
如果我删除依赖项,应用程序启动时没有问题。
前一个配置客户端并调用它来获取数据的类没有被调用。
答案 0 :(得分:1)
为了让Spring知道它应首先处理您的ContextConfiguration
,请向PersistentConfiguration
添加DependsOn
annotation,如下所示:
@DependsOn("contextConfiguration")
@Configuration
public class PersistentConfiguration {
...
问题是你PersistentConfiguration
中没有任何内容告诉Spring它依赖于ContextConfiguration
,尽管它确实是因为前者使用仅由后者初始化的变量。
这正是DependsOn
的用途。来自JavaDoc:
指定的任何bean都保证在此bean之前由容器创建。在bean没有通过属性或构造函数参数显式依赖于另一个bean的情况下很少使用,而是依赖于另一个bean的初始化的副作用。