You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+PostgreSQL:HikariCP返回Null问题求助

我来帮你梳理下问题根源,以及对应的解决方案:

核心问题:手动实例化配置类,脱离Spring容器管理

你在Test类里直接通过new Conn().dataSource()创建DataSource,这完全绕过了Spring的依赖注入机制。Spring的@ConfigurationProperties、@Bean这些注解的生效前提是Bean由Spring容器创建和管理,手动new出来的实例不会触发这些注解的逻辑,导致你的DataSource根本没读取到application.properties里的配置参数,自然会抛出dataSource or dataSourceClassName or jdbcUrl is required的错误。

正确解决方案:通过Spring依赖注入获取DataSource

Spring Boot会帮你管理DataSource的生命周期,你只需要通过依赖注入的方式拿到容器里已经配置好的实例即可,推荐用构造注入(更符合Spring最佳实践,强依赖更清晰):

修改后的Test类代码:

@RestController
public class Test implements ErrorController {
    private final DataSource ds;
    private static final String PATH = "/error";

    // 构造注入,Spring自动把容器中配置好的DataSource实例传入
    public Test(DataSource ds) {
        this.ds = ds;
    }

    @RequestMapping("/connectToDb")
    public void doSomething() {
        System.out.println(ds);
        // 这里可以正常使用ds创建连接、执行预编译语句了
        try (Connection conn = ds.getConnection()) {
            // 你的数据库操作逻辑
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

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

如果你习惯用字段注入,也可以用@Autowired(不过构造注入更推荐):

@RestController
public class Test implements ErrorController {
    @Autowired
    private DataSource ds;
    private static final String PATH = "/error";

    @RequestMapping("/connectToDb")
    public void doSomething() {
        System.out.println(ds);
        // 数据库操作逻辑
    }

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

额外优化建议

  1. 移除冗余配置:

    • 删掉Conn类里的@PropertySource({"classpath:application.properties"}),Spring Boot默认会自动加载application.properties,不需要额外指定。
    • application.properties里的配置不要带多余空格,比如spring.datasource.username= postgres里的空格会导致用户名带空格,可能连接失败,修改成:
      spring.datasource.url=jdbc:postgresql://localhost:5432/test
      spring.datasource.username=postgres
      spring.datasource.password=postgres
      
    • 可以不用指定driverClassName和dataSourceClassName,Spring Boot会根据jdbcUrl自动识别驱动类和适配的DataSource实现。
  2. 简化配置类:
    修改后的Conn类可以更简洁:

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

验证方式

启动Spring Boot应用后,访问/connectToDb接口,控制台应该会打印出类似HikariDataSource@xxxx的实例信息,说明DataSource已经被正确初始化,此时就可以正常执行数据库操作了。

内容的提问来源于stack exchange,提问作者user2868900

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:53:24