spring整合mybatis接口无法注入问题

在学习Spring完之后简单的了解了MyBatis。然后进行简单的整合,遇到MyBatista接口映射的Bean无法自动注入的问题;

代码异常:

线程“main”org.springframe .bean .factory中的异常。创建名为“UserController”的bean时出错:通过字段“userdao”表示的不满足的依赖关系;嵌套异常是org.springframe .bean .factory。BeanCreationException:在文件[C:\Users\li rui long\eclipse-workspace\MyBatis_Demo\build\classes\com\mybatis\dao\ userdao]中创建名为“userdao”的bean时出错。类]:在设置bean属性“sqlSessionFactory”时无法解析对bean“sqlSessionFactory”的引用;嵌套异常是org.springframe .bean .factory。BeanCreationException:在类路径资源[ApplicationContext]中定义名称为“sqlSessionFactory”的bean创建错误。:设置bean属性“dataSource”时不能解析对bean“dataSource”的引用;嵌套异常是org.springframe .bean .factory。BeanCreationException:创建名为“dataSource”的bean时出错:查找方法解析失败;嵌套异常是java.lang。IllegalStateException:未能从ClassLoader [jdk.internal.loader.ClassLoader . [email protected]]内检类[org.apache.commons.dbcp2.BasicDataSource]

异常提示,控制器层的Bean无法创建,原因是MyBatis对应的映射接口无法完成映射,无法生成DAO层的Bean;

所以问题应该出现在XML文件里,

测试类,13行报错:

 1 package com.mybatis.test;
 2
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5
 6 import com.mybatis.controller.UserController;
 7
 8
 9 public class Test_Controller {
10
11     public static void main(String[] args) {
12         // TODO Auto-generated method stub
13         ApplicationContext app = new ClassPathXmlApplicationContext("ApplicationContext.xml");
14         UserController coll = (UserController) app.getBean("UserController");
15         coll.test();
16     }
17
18 }

对ApplicationContext.xml配置文件进行一步步排查:

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
 <!-- 指定需要扫描的包,使注解生效 -->

 <context:component-scan base-package="com.mybatis.po"/>
 <context:component-scan base-package="com.mybatis.dao"/>
 <context:component-scan base-package="com.mybatis.Controller"/>
 <!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
 <property name="driverClassName" value = "com.mysql.jdbc.Driver"/>
 <property name="url" value  ="jdbc:mysql://localhost:3306/Springtest?characterEncoding=utf8"/>
 <property name="username" value = "root"/>
 <property name="password" value ="mysql" />
       <!--  可同时连接的最大的连接数 -->
        <property name="maxActive" value="60" />
       <!--  最大的空闲的连接数 -->
        <property name="maxTotal" value="60" />
       <!--  最小的空闲的连接数,低于这个数量会被创建新的连接,默认为0  -->
        <property name="maxIdle" value="5" />
        <!-- 连接池启动时创建的初始化连接数量,默认值为0 -->
        <property name="initialSize" value="5" />
 </bean>
 <!-- 添加事务支持 -->
 <bean id = "txManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name = "dataSource" ref = "dataSource"/>
 </bean>
 <!-- 开启事务注解 -->
 <tx:annotation-driven transaction-manager ="txManager"/>
 <!-- 配置Mybatis工厂,同时指定数据源,并与MyBatista完美结合 -->
 <bean id="sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean">
     <property name="dataSource" ref ="dataSource"/>
     <!-- configLocation 的属性为Mybatis 的核心配置文件 -->
     <property name = "configLocation" value = "classpath:mybatis-config.xml"></property>
  </bean>
  <!-- Mapper 代理开发,使用Spring自动扫描MyBatista的接口并装配 -->
  <!-- Spring 将指定包中所有的被@Mapper注解标注的接口自动装配为MyBatatis的映射接口 -->
  <bean class = "org.mybatis.spring.mapper.MapperScannerConfigurer">
  <!-- MyBatis-spring组件的扫描器 -->
  <property name="basePackage" value = "com.mybatis.dao"/>
  <property name="sqlSessionFactoryBeanName" value = "sqlSessionFactory"/>
  </bean>

 </beans>
  1. 检查扫描的包名,是否有写错或者少写的。
  2. 确定数据源的配置正常,我的问题就出在这里,修改数据库配置信息(密码等),看是否会报不一样的错,当还是原来的错,说明配置文件没有加载或者数据源错误。我用的DBCP数据源(需要导入两个包DBCP+连接池包),修改密码后还是报同样的错误所以我尝试着用Spring自带的数据源,解决了问题,正确代码:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans  xmlns="http://www.springframework.org/schema/beans"
     3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4         xmlns:context="http://www.springframework.org/schema/context"
     5         xmlns:tx="http://www.springframework.org/schema/tx"
     6         xsi:schemaLocation="
     7         http://www.springframework.org/schema/beans
     8         http://www.springframework.org/schema/beans/spring-beans.xsd
     9         http://www.springframework.org/schema/context
    10         http://www.springframework.org/schema/context/spring-context.xsd
    11         http://www.springframework.org/schema/tx
    12         http://www.springframework.org/schema/tx/spring-tx.xsd">
    13  <!-- 指定需要扫描的包,使注解生效 -->
    14
    15  <context:component-scan base-package="com.mybatis.po"/>
    16  <context:component-scan base-package="com.mybatis.dao"/>
    17  <context:component-scan base-package="com.mybatis.Controller"/>
    18  <!-- 配置数据源 -->
    19 <bean id = "dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
    20  <property name="driverClassName" value = "com.mysql.jdbc.Driver"/>
    21  <property name="url" value  ="jdbc:mysql://localhost:3306/Springtest?characterEncoding=utf8"/>
    22  <property name="username" value = "root"/>
    23  <property name="password" value ="mysql" />
    24  </bean>
    25
    26  <!-- 添加事务支持 -->
    27  <bean id = "txManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager">
    28  <property name = "dataSource" ref = "dataSource"/>
    29  </bean>
    30  <!-- 开启事务注解 -->
    31  <tx:annotation-driven transaction-manager ="txManager"/>
    32  <!-- 配置Mybatis工厂,同时指定数据源,并与MyBatista完美结合 -->
    33  <bean id="sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean">
    34      <property name="dataSource" ref ="dataSource"/>
    35      <!-- configLocation 的属性为Mybatis 的核心配置文件 -->
    36      <property name = "configLocation" value = "classpath:mybatis-config.xml"></property>
    37   </bean>
    38   <!-- Mapper 代理开发,使用Spring自动扫描MyBatista的接口并装配 -->
    39   <!-- Spring 将指定包中所有的被@Mapper注解标注的接口自动装配为MyBatatis的映射接口 -->
    40   <bean class = "org.mybatis.spring.mapper.MapperScannerConfigurer">
    41   <!-- MyBatis-spring组件的扫描器 -->
    42   <property name="basePackage" value = "com.mybatis.dao"/>
    43   <property name="sqlSessionFactoryBeanName" value = "sqlSessionFactory"/>
    44   </bean>
    45
    46  </beans>
  3. 检查对应的依赖类,配置文件路径能否Ctrl进去。MyBatis的核心文件和映射文件路径是否正确。以下是我的代码:
  4. <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <mappers>
        <!-- 映射文件-->
        <mapper resource = "com/mybatis/dao/UserMapper.xml"/>
        </mappers>
    </configuration
     
  5. <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace = "com.mybatis.dao.UserDao">
        <!-- 根据ID查询用户信息 -->
        <select id="selectUserById" parameterType = "Integer" resultType = "com.mybatis.po.Myuser">
        SELECT * FROM user WHERE uid = #{uid}
        </select>
        <!--
        <select id="selectAllUser" resultType = "com.mybatis.po.Myuser">
        SELECT * FROM user
        </select>
        添加一个用户,#{uname}为com.mybatis.po.MyUser属性值
        <insert id ="addUser" parameterType = "com.mybatis.po.Myuser">
        INSERT INTO user (uname,usex) VALUES (#{uname},#{usex})
        </insert>
        修改一个用户
        <update id="updateUser" parameterType = "com.mybatis.po.Myuser">
        UPDATE user SET uname = #{unmae},usex = #{user} where uid = #{uid}
        </update>
        删除一个用户
        <delete id = "delectUser" parameterType = "Integer">
        DELECT from user WHERE uid = #{uid}
        </delete> -->
    </mapper >

    看Dao层的接口和Mapped的映射文件是否是在同一包下。

类似问题的博客:

https://blog.csdn.net/h363659487/article/details/74275972

https://blog.csdn.net/u012385190/article/details/53186552

         嗯嗯,第一次写这样的博客,希望会对大家有帮助!!,愿我们都被温柔以待!2019.4.21。

原文地址:https://www.cnblogs.com/liruilong/p/10744962.html

时间: 2024-10-16 05:18:45

spring整合mybatis接口无法注入问题的相关文章

spring源码剖析(八)spring整合mybatis原理

前言 MyBatis相信很多人都会使用,但是当MyBatis整合到了Spring中,我们发现在Spring中使用更加方便了.例如获取Dao的实例,在Spring的我们只需要使用注入的方式就可以了使用Dao了,完全不需要调用SqlSession的getMapper方法去获取Dao的实例,更不需要我们去管理SqlSessionFactory,也不需要去创建SqlSession之类的了,对于插入操作也不需要我们commit. 既然那么方便,Spring到底为我们做了哪些工作呢,它如何将MyBatis整

Spring整合Mybatis的注意事项

初学 Spring 整合 Mybatis,虽然网贴无数,但是每次试行下来,总会发生这样那样的问题.最终经过数天的不断尝试,总算是成功运行了,遇到的多数坑也一一绕过,特此记录已备查: 一.关于依赖包 网上的很多帖子杂七杂八加入了各种依赖包,有时看的人头晕脑胀,经过实测,实际需要的依赖包,只有下面三组: <!-- 1.基础Spring依赖 --> <dependency> <groupId>org.springframework</groupId> <ar

Spring整合MyBatis(三)sqlSessionFactory创建

摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 目录 一.SqlSessionFactoryBean的初始化 二.获取 SqlSessionFactoryBean 实例 通过Spring整合MyBatis的示例,我们感受到了Spring为用户更加快捷地进行开发所做的努力,开发人员的工作效率由此得到了显著的提升.但是,相对于使用来说,我们更想知道其背后所隐藏的秘密,Spring整合MyBatis是如何实现的呢?通过分析整合示例

spring整合mybatis遇到的bug java.lang.IllegalArgumentException: Property &#39;sqlSessionFactory&#39; or &#39;sqlSessionTemplate&#39; are required

出bug的原因:mybatis-spring版本问题. 查看SqlSessionDaoSupport源码 1.2以上的版本: 1.1.1版本: 解决方法:1.2版本移除了@Autowired的注解,所以如果是1.2版本以上,要在BaseDaoImpl里面手动 注入SetSessionTemplate或者SetSessionFactory spring整合mybatis遇到的bug java.lang.IllegalArgumentException: Property 'sqlSessionFa

Spring整合Mybatis解决 Property &#39;sqlSessionFactory&#39; or &#39;sqlSessionTemplate&#39; are required

在Spring4和Mybatis3整合的时候,dao层注入'sqlSessionFactory'或'sqlSessionTemplate'会报错解决办法如下: package com.alibaba.webx.MyWebxTest.myWebX.module.dao.impl; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.m

spring 整合Mybatis 《错误集合,总结更新》

错误:nested exception is java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor  运行环境:jdk1.7.0_17 + tomcat 7 + eclipse spring整合mybatis启动时候出现這个错误: SEVERE: Exception sending context initialized event to listener instance of class org

Spring整合MyBatis完整示例

为了梳理前面学习的内容<Spring整合MyBatis(Maven+MySQL)一>与<Spring整合MyBatis(Maven+MySQL)二>,做一个完整的示例完成一个简单的图书管理功能,主要使用到的技术包含Spring.MyBatis.Maven.MySQL及简单MVC等.最后的运行效果如下所示: 项目结构如下: 一.新建一个基于Maven的Web项目 1.1.创建一个简单的Maven项目,项目信息如下: 1.2.修改层面信息,在项目上右键选择属性,再选择“Project

Mybatis入门——Spring整合MyBatis

Spring整合MyBatis 对Teacher表进行添加数据和查看数据 1. 创建数据库表 CREATE TABLE `teacher` (  `t_id` varchar(15) NOT NULL,  `t_name` varchar(30) DEFAULT NULL,  PRIMARY KEY (`t_id`)) 2.创建Spring工程 3.导入相关包 mybatis-spring-1.3.0.jar mybatis-3.3.0.jar mysql-connector-java-5.1.

spring整合mybatis(hibernate)配置

一.Spring整合配置Mybatis spring整合mybatis可以不需要mybatis-config.xml配置文件,直接通过spring配置文件一步到位.一般需要具备如下几个基本配置. 1.配置数据源(连接数据库最基本的属性配置,如数据库url,账号,密码,和数据库驱动等最基本参数配置) 1 <!-- 导入properties配置文件 --> 2 <context:property-placeholder location="classpath*:/jdbc.prop