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; } }
额外优化建议
移除冗余配置:
- 删掉
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实现。
- 删掉
简化配置类:
修改后的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
相关产品推荐
相关产品推荐

