C++程序员,因业务需要,使用java搭建服务器,考虑一番后采用springMVC+Mybatis,针对遇到的坑做下分享。
本人使用的是Intellij IDEA,MAVEN,此为背景。
1,No qualifying bean of type [***] found for dependency
首先遇到的是这个问题,按照网上说的几乎所有的解决方式都不奏效,让我深陷在@Service, @Autowired, @Repository 中不能自拔,怀疑是自己对此不够熟悉导致做了蠢操作。
后来静下心,仔细看服务启动过程,发现一个致命问题:我的 spring-mybaitis.xml 怎么没显示加载??(诸如:[org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Loading XML bean definitions from class path resource 这种字样)
然后查看web.xml,坑爹的发现居然没真的没对它进行加载。。。
方式如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-mybatis.xml
</param-value>
</context-param>
填写后欢天喜地的重启服务,这次终于加载了! 但是,错误依旧。。
坑死若干脑细胞后,发现问题是 Mapping加载失败,加载失败的原因就是没找到。
首先mapper.xml 是存在的,并且名称和接口对应,没有问题。
其次XML文件中已经添加了
<context:component-scan
说明系统已经努力去找了,那么说明还是找的地方不对!
我将自动搜索bean的xml代码屏蔽,使用指定bean的形式试了一下:
<bean id="*Mapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.*.*.*Mapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
成功咧。
然后查看target目录,诶?? xml居然不在!!
打包没打进去吗?
上网搜索了一下解决办法,在pom 中增加了一段代码:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
重新启动,发现xml这回有了,但是错误依旧
然后我灵机一动做了个骚操作,大功告成。。
骚操作就是改了一下component-scan的位置,我以前一直以为应该查找代码所在的目录下(dao目录),后来发现其应该查找的是mapper.xml文件,修改成mapping就OK了。
此前还一直纠结mybatis生成的mapping 该放在src下还是resource下,其实对于我来说,只要打包能打进去放哪都一样,当然前提是系统能够找到它。
2,expected single matching bean but found 2
弹出这个错误,比第一个问题好解决多了,这个是由于@XXX 用错了导致的。
为此我总结了一下:
xxxController 前加 @Controller
服务的实现前(***Impl)加 @Resource
dao中的mapper 前加 @Repository
model中的类前加 @Component
service 接口什么都不加,再Impl实现中,类前加@Service, 然后在其中需要使用的数据库Mapper对象前@Autowired