You need to enable JavaScript to run this app. SpringBoot注入时@Qualifier被忽略、存在两个同类型Marshaller依赖启动报错如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot注入时@Qualifier被忽略、存在两个同类型Marshaller依赖启动报错如何解决?

问题原因

你当前使用Lombok的@RequiredArgsConstructor生成构造函数实现依赖注入,而Spring基于构造函数注入时,只会读取构造方法参数上的注解,不会读取字段上的@Qualifier注解。默认情况下@RequiredArgsConstructor生成构造函数时,不会把字段上的@Qualifier注解复制到对应参数上,因此你写在字段上的指定规则没有生效,Spring按类型匹配时检测到2个同类型Bean就抛出了冲突错误。

解决方法

  • 方法1:自定义构造函数,将@Qualifier注解放到构造参数上
@Repository
@Slf4j
public class ServeiTerritorialCatalegsClientRepositoryImpl implements ServeiTerritorialCatalegsClientRepository {

    private final Marshaller marshaller;

    public ServeiTerritorialCatalegsClientRepositoryImpl(@Qualifier("catalegsMarshaller") Marshaller marshaller) {
        this.marshaller = marshaller;
    }
    //...
}
  • 方法2:配置Lombok,使其自动复制@Qualifier注解到构造参数
    在项目根目录创建/修改lombok.config配置文件,添加如下配置:
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier

添加后Lombok生成构造函数时会自动把字段上的@Qualifier注解放到对应参数上,原有代码无需修改即可生效。

  • 方法3:为优先使用的Bean添加@Primary注解
    如果某一个Marshaller是业务中默认优先使用的,可以给对应的Bean定义添加@Primary注解,Spring遇到同类型Bean冲突时会优先选择标注了@Primary的Bean:
@Bean
@Primary
public Marshaller catalegsMarshaller() throws JAXBException {
  //...
}
  • 方法4:修改字段名和目标Bean名称保持一致
    Spring按类型匹配到多个同类型Bean时,会自动尝试按字段名匹配Bean名称,你可以直接把字段名修改为catalegsMarshaller,无需额外配置即可注入正确的Bean:
@Repository
@RequiredArgsConstructor
@Slf4j
public class ServeiTerritorialCatalegsClientRepositoryImpl implements ServeiTerritorialCatalegsClientRepository {

    private final Marshaller catalegsMarshaller;

    //...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 07:45:00