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

配置多JDBC数据源与仓库后EntityCallback完全失效问题

Spring Data JDBC多数据源下EntityCallback失效问题解决

问题根源

手动构建JdbcRepositoryFactory时,未将Spring容器中的EntityCallback实例注册到工厂中。Spring Data JDBC的回调机制依赖EntityCallbackRegistry统一管理回调逻辑,手动实例化工厂不会自动加载这些回调Bean,导致BeforeDeleteCallback、AfterSaveCallback等无法触发。

解决方案

修改仓库工厂配置类,注入EntityCallbackRegistry(或直接注入所有EntityCallback实例),并通过JdbcRepositoryFactory.addEntityCallbacks()方法完成注册。

修改后的BarRepoConfig代码

@Configuration
public class BarRepoConfig {

    private final JdbcRepositoryFactory barRepositoryFactory;

    public BarRepoConfig(
            @Qualifier("barDataAccessStrategy") DataAccessStrategy dataAccessStrategy,
            RelationalMappingContext context,
            JdbcConverter converter,
            Dialect dialect,
            ApplicationEventPublisher publisher,
            @Qualifier("barNamedParameterJdbcTemplate") NamedParameterJdbcTemplate barNamedParameterJdbcTemplate,
            EntityCallbackRegistry entityCallbackRegistry) {

        this.barRepositoryFactory = new JdbcRepositoryFactory(
                dataAccessStrategy,
                context,
                converter,
                dialect,
                publisher,
                barNamedParameterJdbcTemplate);
        
        // 注册所有EntityCallback实例
        barRepositoryFactory.addEntityCallbacks(entityCallbackRegistry.getCallbacks());
    }

    @Bean
    @Primary
    public BarRepo barRepositoryTest() {
        return barRepositoryFactory.getRepository(BarRepo.class);
    }

}

备选实现(直接注入回调列表)

如果项目中无法获取EntityCallbackRegistry,可直接注入容器中所有EntityCallback实例:

public BarRepoConfig(
            // 保留原有依赖注入
            @Qualifier("barDataAccessStrategy") DataAccessStrategy dataAccessStrategy,
            RelationalMappingContext context,
            JdbcConverter converter,
            Dialect dialect,
            ApplicationEventPublisher publisher,
            @Qualifier("barNamedParameterJdbcTemplate") NamedParameterJdbcTemplate barNamedParameterJdbcTemplate,
            List<EntityCallback<?>> entityCallbacks) {

        this.barRepositoryFactory = new JdbcRepositoryFactory(
                dataAccessStrategy,
                context,
                converter,
                dialect,
                publisher,
                barNamedParameterJdbcTemplate);
        
        // 注册回调
        barRepositoryFactory.addEntityCallbacks(entityCallbacks);
    }

额外验证项

  • 确认你的EntityCallback实现类已添加@Component注解,被Spring容器扫描并管理。
  • 检查回调的泛型类型是否与目标实体类匹配,例如AfterSaveCallback<Bar>需对应你操作的实体类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 23:32:42