解决@Autowired注解Mapper报错问题

@Autowired注解Mapper报错

    • 问题描述
    • 解决方法

问题描述

代码如下:
Mapper类

@Mapper
public interface CategoryMapper {
@Select("select * from category_")
List<Category> findAll();

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Controller类

@Controller
public class CategoryController {
@Autowired
CategoryMapper categoryMapper;

@RequestMapping("listCategory")
public String listCategory(Model m){
    List<Category> cs = categoryMapper.findAll();
    m.addAttribute("cs",cs);
    return "listCategory";
}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Could not autowire.No beans of ‘CategoryMapper’ type found.

解决方法

在Mapper类上加@Repository注解

@Mapper
@Repository
public interface CategoryMapper {
//@Select("select * from category_")表明调用findAll方法会调用相应的sql语句
@Select("select * from category_")
List<Category> findAll();

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

解决@Autowired注解Mapper报错问题_第1张图片

                                

       使用Spring boot +mybatis框架时,在service实现类中使用Mapper类,给Mapper类添加@Autowired注解时发现有错误提示:could not autowire,no beans of "XXX" type found,但程序的编译和运行都正常。

处理方式:

方案一:@Autowired(required = false)   设置required 属性值为 false,错误消失

方案二:用@Resource注解替换@Autowired注解,错误消失

----------------------------------------------------------------------------------------------------------------------------------

@Resource注解与@Autowired注解的异同点

这两个注解都是用作bean的注入时使用,都是为一个对象变量省去写get,set方法,自动为这个对象注入实例化对象(即注入依赖)注入的方式还是有所区别的 :

@Autowired是基于spring的注解org.springframework.beans.factory.annotation.Autowired,它默认是按类型进行的装配的,如果想要它按名字进行装配则需在@autowired下面添加@qualifier("name")`注解,都无法找到唯一的一个实现类的时候报错。@Autowired注解默认情况下必须要求依赖对象必须存在,如果要允许null值,则应该设置它的required属性为false,

@Resource 是基于j2ee的注解(可以减少了与spring的耦合),(JDK1.6以上支持)默认是按名字进行注解,若不指定装配bean的名字,当注解写在字段上时,默认取字段名,按照名称查找通过set方法进行装配,倘若有多个子类,则会报错。需要注意的是name属性一旦指定,就只会按照名称进行装配


你可能感兴趣的:(Java)