zoukankan      html  css  js  c++  java
  • service里无法注入mapper,mapper空指针

    被困扰了一天,终于解决了,记录一下

    下面是mapper的代码

    @Mapper
    public interface ProductDao {
        @Select("select * from product")
        List<Product> findAll() throws Exception;
    }

    然后是service的代码

    @Service
    @Transactional
    public class ProductServiceImpl implements ProductService {
    
        @Autowired
        private ProductDao productDao;
    
        @Override
        public List<Product> findAll() throws Exception {
            return productDao.findAll();
        }
    }

    然后是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/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    
        <!--配置注解扫描,扫描service和dao-->
        <context:component-scan base-package="com.rao.travel.service"/>
        <context:component-scan base-package="com.rao.travel.dao"/>
    
        <!--引入数据库配置文件-->
        <context:property-placeholder location="classpath:db.properties"/>
    
        <!--配置连接池-->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="${jdbc.driver}"/>
            <property name="jdbcUrl" value="${jdbc.url}"/>
            <property name="user" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
    
        <!--配置session工厂-->
        <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!--扫描dao接口-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.rao.travel.dao"/>
        </bean>
    
        <!--配置事务管理器-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!--开启事务注解-->
        <tx:annotation-driven transaction-manager="transactionManager"/>
    </beans>

    然后是springmvc的代码

    <?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"
           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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!--扫描所有包下的注解-->
        <context:component-scan base-package="com.rao.travel"/>
    
        <!--配置视图解析器-->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/pages/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!-- 设置静态资源不过滤 -->
        <mvc:resources location="/css/" mapping="/css/**" />
        <mvc:resources location="/img/" mapping="/img/**" />
        <mvc:resources location="/js/" mapping="/js/**" />
        <mvc:resources location="/plugins/" mapping="/plugins/**" />
    
        <!-- 开启对SpringMVC注解的支持 -->
        <mvc:annotation-driven/>
    
        <!--aop的动态代理使用cglib-->
        <aop:aspectj-autoproxy proxy-target-class="true"/>
    </beans>

    问题来了:

    spring和springmvc使用的是两个容器,spring容器是springmvc容器的父容器,子容器可以访问父容器,反过来不行。

    初始化时先加载父容器,然后加载子容器,所以如果父容器已经有的类,子容器在注入是会覆盖父容器已有的bean。

    上面我在spring里面注入了service和mapper,然后在springmvc里面又注入了一遍,这样可能会导致空指针异常。

    所以我们在配置时,controller在springmvc中注入,service和mapper在spring中注入。

    问题解决。

  • 相关阅读:
    Python数据库操作、Python DB API、数据库连接对象connection、数据库游标对象cursor
    django开发Web集成 DjangoUeditor 富文本编辑器
    使用requests库获取GitHub网站API接口数据,显示到pygal柱形图
    使用matplotlib.plot绘制随机点位图
    使用plot绘制随机漫步点位图
    使用maplotlib曲线图,显示每天最低、最高温的曲线图
    使用random随机100次,统计骰子每个点子出现次数的pygal图表
    使用pygal.maps.world库读取JSON格式文件,显示世界人口地图图示
    使用pygal.maps.world库读取CSV、JSON格式文件,显示世界GDP地图图示
    生产者,消费者 多线程
  • 原文地址:https://www.cnblogs.com/rao11/p/11755871.html
Copyright © 2011-2022 走看看