我找到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
答案 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