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

Spring Data JDBC 3.0.6及以上版本BeforeConvertCallback失效求助

问题解决:Spring Boot 3.0.6+中BeforeConvertCallback未触发导致ID为null错误

问题现象

在Spring Boot 3.0.5配套的Spring Data JDBC中,通过BeforeConvertCallback生成MyEntity的ID可以正常工作,但升级到3.0.6及以上版本后,出现SQL错误:ERROR: null value in column "id" of relation,推测BeforeConvertCallback未被调用。

解决方案

方案1:移除不必要的AbstractJdbcConfiguration继承

如果项目没有自定义JDBC配置的特殊需求,无需继承AbstractJdbcConfiguration,Spring Boot自动配置已提供默认JDBC支持。修改后配置类如下:

@Configuration
@EnableJdbcRepositories
class JdbcConfig {

    @Bean
    BeforeConvertCallback<MyEntity> beforeSaveCallback() {
        return (entity) -> {
            if (entity.getId() == null) {
                entity.setId(UUID.randomUUID().toString());
            }
            return entity;
        };
    }
}

方案2:保留AbstractJdbcConfiguration并显式注册回调

若必须继承AbstractJdbcConfiguration,需确保EntityCallback被正确注册。可通过重写jdbcCustomConversions方法,将回调加入自定义转换逻辑:

@Configuration
@EnableJdbcRepositories
class JdbcConfig extends AbstractJdbcConfiguration {

    @Override
    protected JdbcCustomConversions jdbcCustomConversions() {
        return new JdbcCustomConversions(
            List.of(beforeSaveCallback())
        );
    }

    @Bean
    BeforeConvertCallback<MyEntity> beforeSaveCallback() {
        return (entity) -> {
            if (entity.getId() == null) {
                entity.setId(UUID.randomUUID().toString());
            }
            return entity;
        };
    }
}

原因分析

Spring Data JDBC 3.0.6及以上版本对EntityCallback的注册逻辑做了调整,当自定义配置类继承AbstractJdbcConfiguration时,默认的回调自动扫描机制会失效,需要显式注册回调,或移除不必要的父类继承,让Spring Boot自动配置管理回调Bean的生命周期。

内容的提问来源于stack exchange,提问作者hubert.volz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:20:25