DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Spring Boot 自定义 Hikari 数据源报 jdbcUrl is required

自定义 Hikari 数据源已有 URL 却报 jdbcUrl is required,沿 Bean 确认绑定对象。区分直接绑定 jdbc-url 与 DataSourceProperties 的 url 转换,保持两层参数前缀一致。

application.yml 已经写了数据库 URL,自定义数据源一创建连接却报:

jdbcUrl is required with driverClassName.

如果代码在 @Bean 方法上用 @ConfigurationProperties 直接绑定 HikariDataSource,要核对的是目标对象的属性名。Hikari 使用 jdbcUrl,没有 url 属性;Spring Boot 的 DataSourceProperties 才负责把通用的 url 转给具体连接池。

本文的 import 和配置写法针对 Spring Boot 3.x,连接池使用 HikariCP。相同报错也可能来自配置前缀或 profile 错误,因此先找到实际创建报错连接池的 Bean,不能只看到一句日志就把全项目的 url 改名。

直接绑定连接池时使用 jdbc-url

例如已有配置类中声明:

@Bean
@ConfigurationProperties("app.datasource")
public HikariDataSource dataSource() {
    return DataSourceBuilder.create()
            .type(HikariDataSource.class)
            .build();
}

这是方法片段,相关类型是 com.zaxxer.hikari.HikariDataSource、org.springframework.boot.jdbc.DataSourceBuilder、org.springframework.boot.context.properties.ConfigurationProperties 和 org.springframework.context.annotation.Bean。

返回对象是 Hikari,绑定过程会直接寻找它的属性。下面用 H2 内存数据库展示键名;需要项目有 H2 JDBC 驱动,实际项目应换回自己的 URL、驱动和凭据管理方式:

app:
  datasource:
    jdbc-url: jdbc:h2:mem:example
    driver-class-name: org.h2.Driver
    username: sa
    password: ""
    maximum-pool-size: 8

这里的 jdbc-url 可绑定到 jdbcUrl。宽松绑定能处理连字符与驼峰写法,却不会把任意 url 自动理解成 jdbcUrl。配置中的 app.datasource.url 在这条直接绑定路径中不能提供所需的连接地址。

H2 空密码只用于这个内存数据库示例,不是外部数据库的建议。此例也不会创建业务表。保存原数据源配置后再改键名,避免把已有数据连接到另一套库。

想保留 url,就先绑定 DataSourceProperties

自定义数据源也可以沿用 url。让一层属性对象接收连接信息,再让连接池对象接收池参数:

package com.example.config;

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration(proxyBeanMethods = false)
public class DatabaseConfiguration {
    @Bean
    @Primary
    @ConfigurationProperties("app.datasource")
    public DataSourceProperties appDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.configuration")
    public HikariDataSource appDataSource(
            @Qualifier("appDataSourceProperties")
            DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder()
                .type(HikariDataSource.class)
                .build();
    }
}

对应配置为:

app:
  datasource:
    url: jdbc:h2:mem:example
    driver-class-name: org.h2.Driver
    username: sa
    password: ""
    configuration:
      maximum-pool-size: 8

app.datasource.* 进入 DataSourceProperties;app.datasource.configuration.* 进入 Hikari。initializeDataSourceBuilder() 根据前者的状态建立数据源,并完成 URL 属性的适配。两个绑定前缀承担的职责不同,不能把 maximum-pool-size 留在上层后假定它已经生效。

示例将这个自定义数据源作为主数据源,因此同时标明属性对象和数据源的 @Primary。已有多数据源项目应保留自己明确的主从角色,通过 @Qualifier 选择匹配的属性对象;不要给所有数据源都加 @Primary。这里没有展示多套 JPA、事务管理器或仓库的绑定,修好连接池地址也不会自动完成那些配置。

自动配置的数据源不需要一律改键名

没有自定义数据源、使用 Boot 自动配置时,spring.datasource.url 是正常的连接信息配置,Hikari 专有参数通常放在 spring.datasource.hikari.*。自动配置已经提供了通用属性到连接池的转换。

如果项目本来只需要单数据源,却另外写了一段没有必要的 @Bean DataSource,先评估是否可以恢复自动配置。删除自定义 Bean 会改变创建路径,应确认它没有承载其他设置、初始化或命名约定;不要直接删除多数据源所需的 Bean。

如果采用上面任一写法仍报相同错误,沿报错中的池名找到对应配置前缀,确认当前 profile 下该键确实有值。多数据源可能只修好了一个池,另一个仍绑定 url 到 Hikari。查看配置时不要输出密码;仅核对 URL、驱动和 Bean 的对应关系。

修正后的结果应是目标数据源具有预期 JDBC URL,连接创建越过配置校验,并且连接到预期数据库。若随后报认证失败或连接拒绝,地址绑定这一关已经通过,需要继续处理后续错误。回退时恢复原 Bean 与配置一起回退,避免留下前缀和绑定对象不匹配的组合。