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

