Duplicate interface definition for class ‘AFHTTPResponseSerializer‘错误

本文介绍了一个OC项目在引入Swift代码后遇到的编译错误及解决办法。主要原因是使用了use_frameworks!导致第三方库重复定义。解决方案是在Podfile中注释掉use_frameworks!,并在桥接文件中手动导入所需的第三方库。

事情经过

今天编译公司老的oc项目因为我使用了swift,之前混编没有出错,直到我再podfile里面添加了use_frameworks!,因为有的第三方库要使用这句话,然后编译出现了20多条错误,
我的项目是oc项目,但是我要使用我的swift文件的代码.(如果着急直接看最下面的最终解决方案,上面是swift项目的方法,但是不能根本解决oc项目使用swift文件和库)

基本就是下面这些错误

Duplicate interface definition for class ‘AFHTTPResponseSerializer’
No type or protocol named ‘AFURLResponseSerialization’
Reference to ‘AFURLResponseSerialization’ is ambiguous
Duplicate interface definition for class ‘AFImageResponseSerializer’

主要原因

因为添加use_frameworks!以后swift项目会从静态库或者动态库里面编译第三方库.然后我再桥接文件 项目名-Bridging-Header.h 中又包含了一次 第三方库,所以导致重定义,编译器不知道到底要链接哪一个文件造成的错误,所以解决方法就是:在桥接文件中删除掉
//#import <AFNetworking/AFNetworking.h>
把重定义的AFNetworking 注释掉,这样因为podfile中有了use_frameworks!所以依然能找到链接的第三方库在哪里.

下面是出错的图

在这里插入图片描述

<think>我们遇到了一个新的异常:`ConflictingBeanDefinitionException`,表明有两个同名的Bean(都叫'businessServiceImpl'),但分别位于不同的包中(一个是`server`包,一个是`client`包),导致冲突。 解决方案的核心是解决Bean名称冲突。以下是具体步骤: </think>### 回答: 根据新的报错 `ConflictingBeanDefinitionException: Annotation-specified bean name 'businessServiceImpl'`,这表明存在同名的 Bean 定义冲突。以下是完整的解决方案: --- ### **问题本质分析** ```bash ConflictingBeanDefinitionException: Bean name 'businessServiceImpl' conflicts with existing, non-compatible bean definition ``` 关键问题: 1. **同名 Bean 冲突**:存在两个类都声明为 `@Service("businessServiceImpl")` 2. **类路径相同但功能不同**:冲突类分别为: - `com.tplink.smb.cloud.proxy.server.service.server.BusinessServiceImpl` - `com.tplink.smb.cloud.proxy.server.service.client.BusinessServiceImpl` --- ### **直接解决方案** #### 1. **重命名 Bean(首选方案)** 在实现类上显式指定不同的 Bean 名称: ```java // 服务端实现类 @Service("serverBusinessService") // ⭐ 唯一命名 public class BusinessServiceImpl implements BusinessService { ... } // 客户端实现类 @Service("clientBusinessService") // ⭐ 唯一命名 public class BusinessServiceImpl implements BusinessService { ... } ``` #### 2. **按需限定注入点** 在注入时指定具体 Bean: ```java @Resource(name = "serverBusinessService") // 注入服务端实现 private BusinessService serverService; @Resource(name = "clientBusinessService") // 注入客户端实现 private BusinessService clientService; ``` #### 3. **使用条件注解隔离** 按环境加载不同实现: ```java // 服务端实现类 @Service @ConditionalOnProperty(name = "service.mode", havingValue = "server") public class ServerBusinessImpl implements BusinessService { ... } // 客户端实现类 @Service @ConditionalOnProperty(name = "service.mode", havingValue = "client") public class ClientBusinessImpl implements BusinessService { ... } ``` --- ### **架构重构方案** #### 方案1:分包重构 ```diff src/main/java └── com.tplink.smb.cloud.proxy.server ├── service │ ├── server # 服务端实现 │ │ └── ServerBusinessServiceImpl.java │ └── client # 客户端实现 │ └── ClientBusinessServiceImpl.java ``` #### 方案2:接口分离模式 ```java // 服务端专用接口 public interface ServerBusinessService extends BusinessService { void serverSpecificMethod(); } // 客户端专用接口 public interface ClientBusinessService extends BusinessService { void clientSpecificMethod(); } ``` --- ### **冲突检测与预防** #### 1. Bean 名称冲突扫描 在测试中添加冲突检测: ```java @Test void checkBeanNameConflicts() { Map<String, String> beanNameMap = new HashMap<>(); for (String beanName : ctx.getBeanDefinitionNames()) { Class<?> beanClass = ctx.getType(beanName); if (beanNameMap.containsKey(beanName)) { Assert.fail("Bean名称冲突: " + beanName + " | 类1: " + beanNameMap.get(beanName) + " | 类2: " + beanClass.getName()); } beanNameMap.put(beanName, beanClass.getName()); } } ``` #### 2. Maven Enforcer 强制规则 在 `pom.xml` 添加类名冲突检测: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <executions> <execution> <id>enforce-class-uniqueness</id> <goals><goal>enforce</goal></goals> <configuration> <rules> <banDuplicateClasses> <ignoreClasses> <ignoreClass>org.slf4j.*</ignoreClass> </ignoreClasses> <findAllDuplicates>true</findAllDuplicates> </banDuplicateClasses> </rules> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` --- ### **故障排查表** | 步骤 | 命令/方法 | 预期结果 | |------|-----------|----------| | 1. 列出所有BusinessService实现 | `ctx.getBeansOfType(BusinessService.class)` | 返回多个Bean实例 | | 2. 检查Bean名称 | `Arrays.asList(ctx.getBeanNamesForType(BusinessService.class))` | 名称应不同 | | 3. 验证类加载器 | `businessService.getClass().getClassLoader()` | 相同类加载器 | | 4. 包结构验证 | `mvn dependency:analyze-duplicate` | 无重复类 |
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值