报错 org.springframework.beans.factory.UnsatisfiedDependencyException。

自己写了个demo,没有连接数据库操作的时候运行正常,集成mybatis后启动报错,找不到dao层bean。

org.springframework.beans.factory.UnsatisfiedDependencyException:
 Error creating bean with name 'userServiceImpl': 
 Unsatisfied dependency expressed through field 'userMapper'; 
 nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
 No qualifying bean of type 'com.zt.mapper.UserMapper' available: 
 expected at least 1 bean which qualifies as autowire candidate.
 Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
  
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:586)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:372)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1341)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:572)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:409)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:291)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4861)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5322)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
	
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type 'com.zt.mapper.UserMapper' available:
expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1506)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:583)
	... 24 common frames omitted

首先根据这个报错信息提示 在注解@Autowired 中加入属性@Autowired(required=true)

Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

加入注解后启动未报错,但是调用dao层时显示null。还是bean未装载。

在网上找了很多解决方案,都不是我遇到的问题,基本上大部分都是说配置扫描dao层的路径错了

一,

在spring-servlet.xml中配置:

<!-- 加载配置文件 -->
 	<import resource="classpath*:/spring-mybatis.xml"/>
    <context:component-scan base-package="com.zt.service.**,com.zt.mapper.**,com.zt.service.impl.**" annotation-config="true">
    	 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
<!-- 注解扫描包 -->  
    <context:component-scan base-package="com.zt.controller.**">  
    	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>
    <mvc:annotation-driven/>
二,

还有的是说service层未添加@service 注解,但是未加注解是报错
Unsatisfied dependency expressed through field ‘XXXserviceImpl’;

 @Service

我的问题就是配置文件放置的目录不对 新建一个resource文件,将配置文件放在src/resource目录下。
在这里插入图片描述
改成下面这样就可以正常启动加载了。
在这里插入图片描述
由于对springmvc-servlet.xml , spring-context.xml(applicationContext.xml) 概念比较模糊顺便学习了一下

  1. applicationContext.xml是ContextLoaderListener执行加载的,而xxx-servlet.xml是DispatcherServlet的执行加载的
  2. 加载的先后顺序是listener>filter>servlet;
  3. spring-servlet.xml可以对视图文件(如freemarker、jsp等)进行初始化操作,如定义视图文件的位置,定义全局变量、定义拦截器等等。
  4. spring-context.xml是应用上下文、全局的配置。其启动配置一般在web.xml的Listener节点中, 注意Listener和servlet的区别,加载优先级是Listener大于servlet,同时两者性质也不同,Listener的操作是对一个事件对象的监听,而servlet和filter比较类似,是对于URL的一种匹配拦截。
以下是详细配置:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
id="WebApp_ID" version="3.0">
   <context-param>
   	<param-name>contextConfigLocation</param-name>
   	<param-value>classpath:spring-context.xml</param-value>
   </context-param>
   <listener>
   	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
   <!-- <listener>
   	<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
   </listener> -->
   
   <filter>
   	<filter-name>encodingFilter</filter-name>
   	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
   	<init-param>
   		<param-name>encoding</param-name>
   		<param-value>UTF-8</param-value>
   	</init-param>
   	<init-param>
   		<param-name>forceEncoding</param-name>
   		<param-value>true</param-value>
   	</init-param>
   </filter>
   
   <filter-mapping>
   	<filter-name>encodingFilter</filter-name>
   	<url-pattern>/*</url-pattern>
   </filter-mapping>
   
   <servlet-mapping>
   	<servlet-name>default</servlet-name>
   	<url-pattern>/resource/*</url-pattern>
   </servlet-mapping>
   
   <session-config>
   	<session-timeout>1440</session-timeout>
   </session-config>
   <mvc:default-servlet-handler/>
   <!-- 静态资源文件默认处理  -->
 	<servlet-mapping>
   	<servlet-name>default</servlet-name>
   	<url-pattern>*.js</url-pattern>
 	</servlet-mapping>
 	<servlet-mapping>
   	<servlet-name>default</servlet-name>
   	<url-pattern>*.css</url-pattern>
 	</servlet-mapping>
 	<servlet-mapping>
   	<servlet-name>default</servlet-name>
   	<url-pattern>*.png</url-pattern>
 	</servlet-mapping>
 	<servlet-mapping>
   	<servlet-name>default</servlet-name>
   	<url-pattern>*.jpg</url-pattern>
 	</servlet-mapping>
   <servlet-mapping>
   	<servlet-name>default</servlet-name>
   	<url-pattern>*.ico</url-pattern>
 	</servlet-mapping>
 	<servlet-mapping>
   	<servlet-name>default</servlet-name>
   	<url-pattern>*.mp4</url-pattern>
 	</servlet-mapping>
 	<servlet-mapping>
   	<servlet-name>default</servlet-name>
   	<url-pattern>*.gif</url-pattern>
 	</servlet-mapping>
   <servlet-mapping>
   	<servlet-name>default</servlet-name>
   	<url-pattern>*.map</url-pattern>
 	</servlet-mapping>
 	<servlet-mapping>
   	<servlet-name>default</servlet-name>
   	<url-pattern>*.json</url-pattern>
 	</servlet-mapping>
 	<servlet-mapping>
   	<servlet-name>default</servlet-name>
   	<url-pattern>*.cur</url-pattern>
 	</servlet-mapping>

   <servlet> 
   	<servlet-name>spring</servlet-name>
   	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   	<init-param>
   		<param-name>contextConfigLocation</param-name>
   		<param-value>classpath:spring-servlet.xml</param-value>
   	</init-param>
   	<load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
   	<servlet-name>spring</servlet-name>
   	<url-pattern>/</url-pattern>
   </servlet-mapping>
</web-app>
spring-contextx.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:mvc="http://www.springframework.org/schema/mvc"
   xmlns:aop="http://www.springframework.org/schema/aop"
   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/aop
   http://www.springframework.org/schema/aop/spring-aop.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">
   <!-- 加载mybatis配置文件 -->
	<import resource="classpath*:/spring-mybatis.xml"/>
   <context:component-scan base-package="com.zt.service.**,com.zt.mapper.**,com.zt.service.impl.**" annotation-config="true">
   	 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
   </context:component-scan>
   <aop:aspectj-autoproxy/>
</beans>
spring-servlet.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:mvc="http://www.springframework.org/schema/mvc"  
   xmlns:task="http://www.springframework.org/schema/task" 
   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-4.1.xsd  
   http://www.springframework.org/schema/mvc  
   http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
    http://www.springframework.org/schema/task 
      http://www.springframework.org/schema/task/spring-task-3.0.xsd ">  
   <!-- 注解扫描包 -->  
   <context:component-scan base-package="com.zt.controller.**">  
   	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
   	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
   </context:component-scan>
   <mvc:annotation-driven/>
   <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
 	 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
   <!-- 定义视图解析器 -->    
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
       <property name="prefix" value="/main/webapp/jsp/"></property>  
       <property name="suffix" value=".jsp"></property>  
   </bean>  
	<!-- 需要配置以下配置,不然会导致静态文件访问不到,根据自己项目文件的地址配置 -->
   <mvc:resources mapping="/resource/**" location="/resource/"/>
</beans>  
spring-mybatis.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/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 加载配置文件 -->
    <context:property-placeholder location="classpath*:mybatis.properties"/>

    <!-- 数据库连接池,使用dbcp -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxActive" value="10"/>
        <property name="maxIdle" value="5"/>
    </bean>
    <!-- 让Spring管理SqlSessionFactory使用mybatis和spring整合包中的 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage" value="com.zt.model" />
        <property name="mapperLocations" value="classpath*:com/zt/mapper/mapping/*.xml"/>
        <!-- 加载mybatis的全局配置文件 -->
        <property name="configLocation" value="classpath:mybatis-conf.xml" />
    </bean>
     
  
    <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->  
    <bean id="transactionManager"  
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean> 
    <tx:annotation-driven transaction-manager="txManager"/>
	<!-- 4. 扫描Mapper,并将其生命周期纳入Spring的管理 (配置Mapper接口)-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	    <property name="basePackage" value="com.zt"/>
	    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
	</bean>
</beans>

mybatis-conf.xml
<?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>
 
 	<settings>
        <!-- 这个配置使全局的映射器启用或禁用缓存 -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="multipleResultSetsEnabled" value="true"/>
        <setting name="useColumnLabel" value="true"/>
        <setting name="defaultExecutorType" value="REUSE"/>
        <setting name="defaultStatementTimeout" value="25000"/>
    </settings>
    <!-- <mappers>
        批量加载映射配置文件,mybatis自动扫描包下的mapper接口进行加载;
            遵循一定的规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中;
            以上规范的前提是:使用的是mapper代理方法;
         
        <package name="com.zt.mapper"/>
    </mappers>  -->
     <!-- 加载数据库文件db.properties  -->
     <!-- <properties resource="mybatis.properties">
         properties中陪可以配置一些属性名和属性值,此处的优先加载 
       <property name="driver" value="${jdbc.driver}"/>
       <property name="url" value="${jdbc.url}"/>
       <property name="username" value="${jdbc.username}"/>
       <property name="password" value="${jdbc.password}"/>
     </properties> -->
 
     <!-- 和Spring整合后,environments配置将废除  -->
    <!-- <environments default="development">
        <environment id="development">
            使用JDBC事务管理,事务控制由mybatis管理 
            <transactionManager type="JDBC"/>
            数据库连接池,由mybatis管理 
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments> -->
 </configuration>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值