泛型依赖注入出现required a single bean, but 2 were found
问题描述
项目使用了tkmybatis,然后在service层使用泛型抽取了公共的CRUD操作,结果在Controller层注入的时候提示
Field dao in com.gisquest.mmp.server.api.service.impl.BaseServiceImpl required a single bean, but 2 were found:
- mmpDesignerAppMapper: defined in file [D:\工作\designer\server-java\mmp-server-api\target\classes\com\gisquest\mmp\server\api\mapper\MmpDesignerAppMapper.class]
- mmpDesignerAppReleaseMapper: defined in file [D:\工作\designer\server-java\mmp-server-api\target\classes\com\gisquest\mmp\server\api\mapper\MmpDesignerAppReleaseMapper.class]
BaseService:
public interface BaseService<T extends BaseDomain> {
int insert(T t,String createBy);
int delete(T t);
int update(T t,String updateBy);
int count(T t);
T selectOne(T t);
PageInfo<T> page(int pageNum, int pageSize, T t);
}
AppService:
public interface AppService<T extends BaseDomain> extends BaseService<T> {
}
AppReleaseService:
public interface AppReleaseService<T extends BaseDomain> extends BaseService<T> {
String getStatus(String id);
}
BaseServiceImpl:
@Service
@Transactional(readOnly = true)
public class BaseServiceImpl<T extends BaseDomain,D extends MyMapper<T>> implements BaseService<T> {
@Autowired
private D dao;
@Override
@Transactional(readOnly = false)
public int insert(T t,String createBy) {
t.setCreateBy(createBy);
t.setCreateDate(new Date());
return dao.insert(t);
}
@Override
@Transactional(readOnly = false)
public int delete(T t) {
return dao.delete(t);
}
@Override
@Transactional(readOnly = false)
public int update(T t,String updateBy) {
t.setUpdateBy(updateBy);
t.setUpdateDate(new Date());
return dao.updateByPrimaryKey(t);
}
@Override
public int count(T t) {
return dao.selectCount(t);
}
@Override
public T selectOne(T t) {
return dao.selectOne(t);
}
@Override
public PageInfo<T> page(int pageNum, int pageSize,T t) {
PageHelper pageHelper = new PageHelper();
pageHelper.startPage(pageNum,pageSize);
PageInfo<T> pageInfo = new PageInfo<>(dao.select(t));
return pageInfo;
}
}
AppServiceImpl:
@Service
@Transactional(readOnly = true)
public class AppServiceImpl extends BaseServiceImpl<MmpDesignerApp, MmpDesignerAppMapper> implements AppService<MmpDesignerApp> {
}
AppReleaseServiceImpl:
@Service
@Transactional(readOnly = true)
public class AppReleaseServiceImpl extends BaseServiceImpl<MmpDesignerAppRelease, MmpDesignerAppReleaseMapper> implements AppReleaseService<MmpDesignerAppRelease> {
@Autowired
private MmpDesignerAppReleaseMapper mapper;
@Override
public String getStatus(String id) {
MmpDesignerAppRelease release = new MmpDesignerAppRelease();
release.setAppid(id);
int i = mapper.selectCount(release);
if(i>0)
return AppStatusConstants.RELEASED.getDesc();
return AppStatusConstants.NOT_RELEASED.getDesc();
}
}
AppController:
public class AppController {
@Autowired
private AppService<MmpDesignerApp> appService;
@Autowired
private AppReleaseService<MmpDesignerAppRelease> releaseService;
解决方法
将不能注入的bean也就是BaseServiceImpl变成抽象类
即在BaseServiceImpl类前加abstract
原因
Exception encountered during context initialization - cancelling refresh attempt:
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'baseServiceImpl':
Unsatisfied dependency expressed through field 'dao';
nested exception is
org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type 'tk.mybatis.mapper.MyMapper<?>' available:
expected single matching bean but found 3:
tbPostsPostMapper,tbSysUserMapper,tbPostsPostExtendMapper
也就是说在创建一个baseServiceImplbean放入容器时候,发现其类内的一个对象不能被明确指示,不能调用其方法。
ps: 参考文档
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)