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
相关产品推荐
相关产品推荐

