今天在研究BaseService,在进行单元测试时,发现tomcat一直报错,错误代码如下:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘这是我的service测试类’: Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [这是我的service类] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(shareable=true, lookup=, name=, description=, authenticationType=CONTAINER, type=class java.lang.Object, mappedName=)}

从信息中,可以看到是找不到需要注入的bean!我的程序是通过注解@Resource注入的。

尝试了网上的N种方法,无非以下几种:

  1. 配置文件没有开启注解扫描bean
  2. spring配置文件里beans标签没配置default-autowire=”byname”
  3. 各种配置问题…
  4. 调用死循环

但是问题依然存在,我就开始去检查需要注入的类有没有问题,结果发现了。

@Transactional
@Service("roomTypeService")
public abstract class RoomTypeServiceImpl extends BaseServiceImpl<RoomType, Integer> implements RoomTypeService {
    // other fileds and methods......
}

不知道小伙伴们看出问题没有,这里的Service注解和name都没有问题,问题出在类写成了抽象类!!!抽象类啊!!!我把它去掉了就能正常跑起来了!!

虽然我不知道为什么当时写成了抽象类,但还是想分享出来让跟我犯错误的同学尽快脱离debug的痛苦。

说回问题的本质,为什么写成了抽象类就无法正常注入呢?这也正是java基础知识:注入相当于实例化一个对象,而在java的语法里面,抽象类(和接口)是无法实例化(new)的,所以就注入失败了!

好久没写过原创的文章了,这样不行,说好的坚持呢= =

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐