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

如何在Service类中获取Bean?解决ModelMapper配置循环依赖报错

问题根因

循环依赖完全是配置类的写法错误导致的:

  • 你给ModelMapperConfig加了@AllArgsConstructor,Lombok会生成包含protected final ModelMapper mapper成员的全参构造函数,Spring初始化这个配置类实例时,必须先注入ModelMapper类型的Bean
  • 但ModelMapper类型的Bean恰恰是在这个配置类的getMapper()方法里定义的,要执行这个Bean的创建逻辑,又得先把配置类实例初始化完成
    两边互相等待对方完成初始化,直接形成依赖闭环,就抛出循环依赖错误。
修复方式

选任意一种改就行:

方案1:直接在@Bean方法内创建ModelMapper实例(最推荐,逻辑最清晰)

不要在配置类里提前注入ModelMapper,直接在Bean声明方法里新建实例做自定义配置:

@Configuration
public class ModelMapperConfig {

    @Bean
    public ModelMapper modelMapper() {
        ModelMapper mapper = new ModelMapper();
        // 自定义映射规则
        mapper.addMappings(new PropertyMap<MerchantDTO, Merchant>() {
            @Override
            protected void configure() {
                skip(destination.getId());
            }
        });
        // 全局配置可以统一在这里加,比如开启私有字段匹配
        mapper.getConfiguration()
                .setFieldMatchingEnabled(true)
                .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE);
        return mapper;
    }
}

方案2:通过方法参数注入待配置的ModelMapper实例

如果你是引入了modelmapper的starter、Spring已经自动创建了ModelMapper实例要做扩展,就不要用配置类成员变量注入的方式,直接在@Bean方法的参数上声明依赖,Spring会在调用Bean创建方法时自动传入对应实例,不会触发配置类初始化阶段的循环依赖:

@Configuration
public class ModelMapperConfig {

    @Bean
    public ModelMapper modelMapper(ModelMapper mapper) {
        mapper.addMappings(new PropertyMap<MerchantDTO, Merchant>() {
            @Override
            protected void configure() {
                skip(destination.getId());
            }
        });
        return mapper;
    }
}

注意:永远不要在@Configuration类里通过构造器/成员变量注入当前类正在声明的同类型Bean,这种写法必然触发循环依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:36:18