(小白提问,有什么不对的指出来)上周遇到了一个问题,项目有点久,没有springMVC的框架,想集成进去,但是后来发现注解无法将mapper注入到容器
mapper就只是一个interface 的.java文件,然后在另一个包下面有映射的.xml文件
在此之前,我单独的将service注入到controller没问题,返回一个了Map在WEB上可以看到,但是我在service层用注解@不论是Res..还是Auto,,都会报错,我确认过配置扫描包路径都没有问题,迫不得已用了原先的配置文件方法,发现又可以了 上两个对比图 ,
,
,新增配置文件如图
,这是mapper现在有两个问题,为什么我配置文件可以,用注解却不行, 第二个,为什么我要用TestMapper mapper = ApplicationContextFactory.getBean("testMapper", TestMapper.class);才能取到mapper,直接用还是空?
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'planController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.zcloudMVC.service.TestService com.zcloudMVC.controller.PlanController.testService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.zcloudMVC.mapper.TestMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(shareable=true, mappedName=, description=, name=, type=class java.lang.Object, authenticationType=CONTAINER, lookup=)}
如果用注解的话,这是报错的原因
<!-- 文控管理Mapper映射,modify by 吴立君 -->
<!-- 扫描特定的包,自动成批创建映射器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zcloudMVC.mapper,com.emacle.docm.mapper" />
<property name="sqlSessionTemplateBeanName" value="sqlSession"/>
</bean>
这是扫描mapper路径
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 扫描路径 -->
<context:component-scan base-package="com.zcloudMVC.controller" />
<context:component-scan base-package="com.zcloudMVC.service" />
<context:component-scan base-package="com.zcloudMVC.mapper" />
这是mvc注解扫描路径
mapper加个注解,@MapperScan
来人帮看一下呀 ,我刚刚又试了一下 在mapper 上加Repstory注解 ,去掉配置文件,都用@Resource,
Error creating bean with name 'testService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.zcloudMVC.mapper.TestMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. 创建service错误,这个意思应该就是mapper没有在容器里吧。
感觉是不是mybatis 动态代理mapper的问题啊,我又看到别人说是不是路径问题
我是这么配置的,在用配置文件的时候那个ref=“testMapper”没问题的
用了配置文件就报错。。。好奇怪
<bean name="testService" class="com.zcloudMVC.service.TestServiceImpl">
<property name="testMapper">
<ref bean="testMapper" />
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zcloudMVC.mapper,com.emacle.docm.mapper" />
<property name="sqlSessionTemplateBeanName" value="sqlSession"/>
</bean>
TestMapper.xml放到com.zcloudMVC.mapper包下面
跟TestMapper.java同一目录试试
(mapper代理开发规范)
程序员需要编写mapper.xml映射文件
程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
开发规范:
(1)在mapper.xml中namespace等于mapper接口地址
(2)mapper.java接口中的方法名和mapper.xml中statement的id一致
(3)mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
(4)mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
@Repository
public interface TestMapper {
public List<User> findUserByName(String name);
}
<mapper namespace="com.zcloudMVC.mapper.TestMapper">
<select id="findUserByName" parameterType="java.lang.String" resultType="com.zcloudMVC.entity.User">
select * from user where username LIKE '%${value}%'
</select>
</mapper>
问题解决了,这个老项目之前的容器不是spring 是这个基础上修改的,具有IOC AOP的特性但是bean都不在spring里面,用的时候自然取不到mapper的bean ,那个application.getBean也是它们自己手写的获得自己容器的bean