Spring Boot Starter。如何在启动器之前停止初始化其他启动器' x'完成豆类创作?

时间:2018-02-05 13:17:57

标签: java spring postgresql spring-boot

我找到postgresql-embedded并为基于此项目的测试porpoises编写 spring-boot-starter 。在运行中在项目中添加启动器依赖项后,它将失败,并显示下一个错误:

  

org.postgresql.util.PSQLException:致命:用户"用户"

的密码验证失败

application.properties

embedded.postgres.database-name=test
embedded.postgres.username=user
embedded.postgres.password=user
embedded.postgres.port=5433

spring.datasource.url=jdbc:postgresql://localhost:5433/test
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.username=user
spring.datasource.password=user
spring.jpa.database=POSTGRESQL

原因是spring-boot-starter-data-jpa在启动嵌入式PostgreSQL之前运行。可以为启动器或任何其他方式设置优先级吗?

初级来源: https://github.com/esempla/spring-boot-starter-embedded-postgres

3 个答案:

答案 0 :(得分:1)

您需要设置一个从DataSource bean启动Postgres的bean的依赖项。您可以在启动器中使用BeanFactoryPostProcessor执行此操作。您可能希望从Boot自己的AbstractDependsOnBeanFactoryPostProcessor,其具体的子类(如MongoClientDependsOnBeanFactoryPostProcessor)及其如何used in auto-configuration中获取灵感。

答案 1 :(得分:0)

Spring Boot Autoconfiguration正在运行,因为它假定在自动配置数据源时Postgresql已经在运行。由于这是一个特殊情况,您使用的是从同一应用程序上下文中启动的嵌入式Postgresql,因此您将无法使用数据源自动配置。

@Configuration
@AutoConfigureAfter({PostgresAutoConfiguration.class})
public class CustomDataSourceConfiguration {

    @Value("${datasource.url}")
    private String dataSourceUrl;

    @Value("${datasource.driver-class}")
    private String dataSourceDriverClass;

    @Value("${datasource.username}")
    private String dataSourceUsername;

    @Value("${datasource.password}")
    private String dataSourcePassword;

    @Bean
    public DataSource dataSource() {
         // Logic to create the DataSource
    }


}

@AutoConfigureAfter将确保在创建数据源之前加载嵌入式Postgresql。

答案 2 :(得分:0)

已经完成了感谢Andy Wilkinson的建议。通过创建 DependsOnBeanFactoryPostProcessor 解决问题如下:

@Order
public class DataSourceDependsOnBeanFactoryPostProcessor extends AbstractDependsOnBeanFactoryPostProcessor {

    public DataSourceDependsOnBeanFactoryPostProcessor(String... dependsOn) {
        super(DataSource.class, LocalContainerEntityManagerFactoryBean.class, dependsOn);
    }
}

在AutoConfiguration类中添加此类作为配置

@Configuration
protected static class EmbeddedPostgresDependencyConfiguration extends DataSourceDependsOnBeanFactoryPostProcessor{
    public EmbeddedPostgresDependencyConfiguration(){
        super("embeddedPostgres");
    }
}

现在这个启动程序适用于我的测试用例。来源可以找到: https://github.com/esempla/spring-boot-starter-embedded-postgres