Spring Boot和PostgreSQL- HikariCP始终返回null

时间:2019-02-19 10:27:35

标签: java spring postgresql spring-boot datasource

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

我在使数据源正常工作时遇到了一些麻烦,它仅返回Null而不是数据源。

这些是我的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

这是我的Connection类,返回数据源:

@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以及尝试不同的方法,但是到目前为止没有任何效果。我发现类似的帖子也有相同的错误消息,但是我还没有找到解决问题的方法。

对此有任何投入吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

问题在这里

@RestController
public class Test implements ErrorController {

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

您不能简单地创建配置的新实例。如果这样做,那么您实际上将忽略所有注释。您特别需要Spring已经创建的实例,可以通过自动装配来实现。

不过,您不需要传递整个配置,只需将该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;
    }
}