Spring数据初始化问题

时间:2017-07-03 19:31:17

标签: java spring-boot spring-data

我有一个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}

如果我删除依赖项,应用程序启动时没有问题。

前一个配置客户端并调用它来获取数据的类没有被调用。

1 个答案:

答案 0 :(得分:1)

为了让Spring知道它应首先处理您的ContextConfiguration,请向PersistentConfiguration添加DependsOn annotation,如下所示:

@DependsOn("contextConfiguration")
@Configuration 
public class PersistentConfiguration {
    ...

问题是你PersistentConfiguration中没有任何内容告诉Spring它依赖于ContextConfiguration,尽管它确实是因为前者使用仅由后者初始化的变量。

这正是DependsOn的用途。来自JavaDoc:

  

指定的任何bean都保证在此bean之前由容器创建。在bean没有通过属性或构造函数参数显式依赖于另一个bean的情况下很少使用,而是依赖于另一个bean的初始化的副作用。