前言

本案例适合使用的IDE是MyEclipse的小伙伴参考,解决思路中的某个步骤对你有所启发。

环境:jdk 1.7 maven-3.2.3  工程启动时报错。

报错原因,报错的接口类的具体实现类没有真正的成功发布到Tomcat。

给使用IDEA工具小伙伴的一点提示

如果你使用的是IDEA,本篇对你的帮助不是很大,不过可以告诉你一些解决思路

该错误往往是因为:

被注解的接口类,在项目启动进行IOC容器自动装配时,找不到它的具体实现类,或者找到了该接口的多个实现类所致。

例如:LxbxService被注解了 @Autowired,在工程启动时,它就会自动寻找它的具体实现类,如果没有找到或者找到多个,都有可能会报这个错误。

如果你明确的知道,这个接口又多个实现类,则在注解接口的时候,需要指明你要使用哪一个实现类,如下所示:

public interface LxbxService{
}

@service("lxbxServiceSh")
public class LxbxServiceShImpl implements LxbxService{
}

@service("lxbxServiceSp")
public class LxbxServiceSpImpl implements LxbxService{
}

public LxbxController {
    @Autowired
    @Qualifier("lxbxServiceSp")//这里就需要指明用的是哪一个实现类
    private LxbxService lxbxService;
}

当然,这两个注解也可以替换为Resource一个注解:

public LxbxController {
	@Resource(name="lxbxServiceSp")
	private LxbxService lxbxService;
}

¥¥使用IDEA的小伙伴,看到这里就可以了,下面的篇幅留给使用MyEclipse的小伙伴参考!¥¥


报错原因:报错接口,其具体实现类所在的工程没有被导入,下面围绕该话题展开!


一、解决步骤

1、主工程Controller层代码截图

2、打开Tomcat,展开,发现Service层的工程包没有被引入进来

后面的步骤,围绕这个问题依次展开!

3、彻查该报错接口所需的依赖工程,是否被引入了

4、小节

看到这里,发现这不是我的错,是MyEclipse工具,哪根神经出问题了,也就是说LxbxService接口的实现类所在的工程包已经被引进来了,就是报错,通过下面的继续查看,得知,是该实现类编译后没有被装配到Tomcat中。

5、绝招,进入项目的工作空间的源码,删除除了src和pom.xml文件以外的所有文件,重新导入整个项目

1)删除除了src和pom.xml文件以外的所有文件

2)移除工程下面报错的那个模块,然后重新导入该模块

移除该工程,不是删除,下面是重新导入该模块

3)从远程仓库,找到Lxbx-service模块重新导入本地工程

4)把该工程重新添加进来,重复发布工程至Tomcat,问题到此解决

总结

1、问题回顾

由于本项目是多工程 controller层和 持久层 以及 接口层 完全分离,不在同一个模块中(每个模块由公司的不同开发小组完成)。

发布到Tomcat后,如果某个工程(接口的实现类)因某种原因,没有以jar/war包的方式没引用到主工程,那么Spring注解就会发生此类错误。

代码本身没有问题,问题出在LxbxCxService是一个接口,它需要自动装配他的实现类LxbxCxServiceImpl,而实现类在另一个工程(hnsi-jmyb-service)里没有被以jar包的方式引入进来(实时证明,打开Tomcat的工程发布的文件夹,该依赖确实没有被发布成功),当然就要报错了。

2、小节

问题出现的根源,就是在项目启动时,在Controller代码中,用@Autowired 注解的 LxbxCxService接口找不到自己的实现类所致。

围绕它,展开一些列排查即可,其中最先想到的就是进入Tomcat查找其实现类是否发布成功(实际上并没有),最后用最简单最暴力的方式,删除工程重新导入,问题得以解决。

尾言

解决问题,首先需要了解该错误报错的根源,顺藤摸瓜,尽量以最简单、最快的方式把问题解决,哪怕粗暴一点也无妨。

有时候的错误,明明知道报错原因,就是难以解决,这样的问题伤害不大,侮辱性极强,先暴力解决就好!!

Logo

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

更多推荐