首页 > 解决方案 > 无法使用 Spring 以编程方式创建 Postgres 数据源

问题描述

我正在尝试以这种方式在线创建一些 Spring 示例中建议的 DataSource:

    @Configuration
public class RepositoryConfiguration {

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

}

我有一个如下所示的 application.yml 文件:

spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://localhost:54320/mydb
    username: postgres
    password: somepassword

当我运行调试器并评估DataSourceBuilder.create().build();值时,似乎没有设置。知道可能缺少什么吗?

在此处输入图像描述

我正在使用 Spring Boot 的 2.2.4 版本

这是我的build.gradle文件

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath "org.postgresql:postgresql:42.2.11"
    }
}

plugins {
    id 'org.springframework.boot' version '2.2.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
    id 'org.flywaydb.flyway' version '6.3.0'
    id 'nu.studer.jooq' version '4.1'
}

group 'com.solution.asclepius'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {

    annotationProcessor 'org.projectlombok:lombok:1.18.8'

    implementation 'org.jooq:jooq'
    implementation 'org.jooq:jooq-codegen'
    jooqRuntime 'org.postgresql:postgresql:42.2.11'
    implementation 'org.projectlombok:lombok:1.18.8'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-jooq'
    implementation 'io.vavr:vavr:0.10.2'

    testCompile group: 'junit', name: 'junit', version: '4.12'
    testCompile group: 'org.mockito', name: 'mockito-core', version: '2.1.0'
    testCompile group: 'org.assertj', name: 'assertj-core', version: '3.15.0'

}

jooq {
    sample(sourceSets.main) {
        jdbc {
            driver = 'org.postgresql.Driver'
            url = 'jdbc:postgresql://localhost:54320/asclepiusdb'
            user = 'postgres'
            password = 'somepassword'
        }
        generator {
            database() {
                name = 'org.jooq.meta.postgres.PostgresDatabase'
                inputSchema = 'public'
                includes = '.*'
            }
            target {
                packageName = 'com.solution.asclepius'
                directory = 'build/generated/java'
            }
        }
    }
}

tasks.generateSampleJooqSchemaSource.with {
    def out = new ByteArrayOutputStream()
    javaExecSpec = { JavaExecSpec s ->
        s.standardOutput = out
        s.errorOutput = out
        s.ignoreExitValue = true
        s.jvmArgs '-Xmx512M'
    }
    execResultHandler = { ExecResult r ->
        if (r.exitValue != 0) {
            throw new RuntimeException('jOOQ source code generation failed:\n\n' + out.toString())
        }
    }
}

flyway {
    url = 'jdbc:postgresql://localhost:54320/asclepiusdb'
    user = 'postgres'
    password = 'somepassword'
    schemas = ['public']
    locations = ["filesystem:$project.projectDir/src/main/resources/db/migration"]
}

目前该应用程序无法启动:

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to bind properties under 'spring.datasource' to javax.sql.DataSource:

    Property: spring.datasource.driver-class-name
    Value: org.postgresql.Driver
    Origin: class path resource [application.yml]:4:24
    Reason: Failed to load driver class org.postgresql.Driver in either of HikariConfig class loader or Thread context classloader

Action:

Update your application's configuration

标签: javaspringpostgresql

解决方案


@ConfigurationPropertiesConfigurationPropertiesBindingPostProcessorbean 创建后处理。

所以不用担心,您的属性将在应用初始化期间稍后设置。您可以在该后处理器中设置一些断点,甚至在HikariConfigHikariDataSource在 Spring Boot 2 中默认使用,它可以是其他东西)并查看过程。


推荐阅读