java - Spring Boot 和 PostgreSQL- HikariCP 总是返回 null

标签 java spring postgresql spring-boot datasource

我正在尝试创建一个没有 JPA/Hibernate 的 spring boot 应用程序(由于复杂的数据库结构,所以我需要对查询进行更多控制)

我在让 DataSource 工作时遇到了一些问题,它只返回 Null 而不是 DataSource。

这些是我的 Pom.xml 依赖项:

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.5</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

这是 application.properties:

spring.datasource.url=jdbc:postgresql://localhost:5432/test
spring.datasource.username= postgres
spring.datasource.password = postgres
spring.datasource.driverClassName = org.postgresql.ds.PGSimpleDataSource
spring.datasource.dataSourceClassName = org.postgresql.ds.PGSimpleDataSource

这是我的连接类返回数据源:

@Configuration
@PropertySource({"classpath:application.properties"})
public class Conn {

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

}

这是我的 RequestHandler,我正在尝试创建连接(现在正在记录,它总是返回 null)。

@RestController
public class Test implements ErrorController {

    private DataSource ds;
    private static final String PATH = "/error";


    @RequestMapping("/connectToDb")
    public void doSomething() {
        ds = new Conn().dataSource();
        System.out.println(ds);
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }

}

每当我尝试将实际数据源用于准备好的语句时,我都会收到错误:

HikariPool-1 - dataSource or dataSourceClassName or jdbcUrl is required.

一直在尝试更改 application.properties 以及尝试不同的方法,但到目前为止没有任何效果。我发现类似的帖子有相同的错误信息,但我还没有找到解决问题的办法。

对此有任何意见吗? 谢谢。

最佳答案

问题就在这里

@RestController
public class Test implements ErrorController {

    @RequestMapping("/connectToDb")
    public void doSomething() {
        ds = new Conn().dataSource(); // <<<<<
        System.out.println(ds);
    }
}

您不能简单地创建配置的新实例。如果你这样做,那么你基本上忽略了所有的注释。您特别需要 Spring 已经创建的实例,您可以通过 Autowiring 来完成。

不过,您不需要传递整个配置,您可以只 Autowiring 那个 bean。

@RestController
public class Test implements ErrorController {

    private final DataSource ds;
    private static final String PATH = "/error";

    public Test(DataSource ds) {
        this.ds = ds;
    }

    @RequestMapping("/connectToDb")
    public void doSomething() {
        System.out.println(ds);
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }
}

关于java - Spring Boot 和 PostgreSQL- HikariCP 总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54764013/

相关文章:

java - Spring方法级 validator

java - Log4j2 设置日志级别

postgresql - 模式的转储结构和数据

postgresql - 在 SQL 中创建查询时需要一些帮助吗?

java - 在外部浏览器中从 WebView 打开一些网站页面

java - OpenSSL FIPS 140-2 符合 Tomcat 5 或任何版本

java - @LazyLoading 和 JsonOutput

java - Spring Multi-Tenancy Web 服务 : postgres vs mongodb

java - 服务器通过 RMI 无需注册

bash - 使用 SSH 在远程服务器上运行命令,但遇到引号问题