SSM项目,Service层注入不了Mapper接口

该项目的环境为:
Java:1.7

使用的IDE是:
IDEA

使用的Jar包为:
spring:4.3.12.RELEASE
mybatis:3.4.1
mybatis-spring:1.3.0

并且使用了通用Mapper
com.github.abel533:3.0.0

出现的问题为:在使用了@Service注解的类中使用@Autowired注入Mapper接口时,IDEA提示:不能自动注入,没有该类型的Beans,也就是容器中没有Mapper接口。

先看配置:



......

 
    
        
        
        
        
        
        
    
     
       
       
       
             
             
       

可以确定上面的包名还有xml文件路径都没有问题。

还有mybatis的配置文件:





    
        
        
    

    
    
        
            
        

        
            
            
            
            
        
    


再看看java代码:
SSM项目,Service层注入不了Mapper接口_第1张图片

IService接口:
/**
 * 通用接口
 */

public interface IService {

    T selectByKey(Object key);

    int save(T entity);

    int delete(Object key);

    int updateAll(T entity);

    int updateNotNull(T entity);

    List selectByExample(Object example);

}
BloggerService接口:

public interface BloggerService extends IService {
    
    Blogger getByUserName(String userName);
}
BaseService类:

public class BaseService implements IService {
    @Autowired
    protected Mapper mapper;

    @Override
    public T selectByKey(Object key) {
        return mapper.selectByPrimaryKey(key);
    }

    @Override
    public int save(T entity) {
        return mapper.insert(entity);
    }

    @Override
    public int delete(Object key) {
        return mapper.deleteByPrimaryKey(key);
    }

    @Override
    public int updateAll(T entity) {
        return mapper.updateByPrimaryKey(entity);
    }

    @Override
    public int updateNotNull(T entity) {
        return mapper.updateByPrimaryKeySelective(entity);
    }

    @Override
    public List selectByExample(Object example) {
        return mapper.selectByExample(example);
    }

BloggerServiceImpl类:

@Service("bloggerService")
public class BloggerServiceImpl extends BaseService implements BloggerService {

    @Autowired
    private BloggerMapper bloggerMapper;
    
    @Override
    public Blogger getByUserName(String userName) {
        Example example = new Example(Blogger.class);
        Example.Criteria criteria = example.createCriteria();
        if(StringUtil.isNotEmpty(userName)) {
            criteria.andEqualTo("userName", userName);
        }
        List bloggers = selectByExample(example);
        return bloggers.size() > 0 ? bloggers.get(0) : null;
    }
}

SSM项目,Service层注入不了Mapper接口_第2张图片

如果把

	@Autowired
    private BloggerMapper bloggerMapper;

去掉,单单使用通用接口的方法,不往service注入自定义的接口,可以顺利地继续数据库操作。

网上百度了找了很多方法,说是配置文件的问题,我也照改了,并不起作用;还有在BaseService上加上abstract修饰符等等,都解决不了问题。

而且BaseService中成功地注入了通用Mapper啊,于是往BloggerServiceImpl类中也注入通用Mapper,发现报了一样的错误,于是把@Service("bloggerService")去掉,发现错误没有了,于是把所有的Mapper接口都注入到BaseService解决了问题。

可是我就是想在对应的service中注入Mapper接口,既然容器中没有Mapper接口,那么手动使用@Repository注解,通过注解扫描把Mapper接口放到容器中呢?尝试了一下,也可以解决问题。

难道使用MapperScannerConfigurer扫描到的Mapper接口跟使用@Service注解标注的service类存放的容器不是同一个吗?好像也不太可能吧,本人小白,想不通。

之前的项目也没有存在这样的问题啊,一样的配置文件,区别是没有用到通用Mapper。看了别人使用通用Mapper,还是一样的配置文件,一样的写法,也不需要@Repository注解,是可以在@Service标注的类中使用@Autowired的。

本人的水平非常有限,虽然解决了问题,可是依旧没有找到问题的根源,希望看到该博文的知道问题的前辈可以指点迷津,万分感谢!


没有及时更新,很抱歉。

在IDEA中,settings->inspections->spring->autowriting for bean class,把ERROR改成WARNING,虽然一样提示容器中没有bean,但是项目可以正常运行,本人觉得是IDEA的问题。

你可能感兴趣的:(遇到的问题)