泛型依賴注入出現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: 參考文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM