ServiceImpl调用mapper层代码空指针怎么办?

  1. 这是错误信息 

    2.这是service代码

    package com.blog.service;
    
    import com.blog.mybatis.model.User;
    import org.springframework.stereotype.Service;
    
    @Service("UserService")
    public interface UserService {
        //登录方法
        public User userLogin(User user);
    
        //查询账号是否存在
        public int QueryAccount(String account);
    
        //查询用户
        public User selectUser();
    }
    

    3.这是serviceImpl代码

    @Service("UserService")
    public class UserServiceImpl implements UserService {
        @Autowired(required = false)
        private UserMapper mapper;
    
        @Override
        public User userLogin(User user) {
            return mapper.userLogin(user);
        }
    
        @Override
        public int QueryAccount(String account) {
            return mapper.QueryAccount(account);
        }
    
        @Override
        public User selectUser() {
            return mapper.selectUser();
        }

    4.这是mapper代码

    public interface UserMapper {
        //登录方法
        public User userLogin(User user);
    
        //查询账号是否存在
        public int QueryAccount(String account);
    
        //查询用户
        public User selectUser();
    }

    5.这是mapper.xml代码

    <?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="service.blog.mybatis.mapper.UserMapper">
        <select id="userLogin" resultType="User">
            select *
            from user
            where acct = #{acct}
              and pwd = #{pwd}
        </select>
        <select id="QueryAccount" resultType="User">
            select email from user where email = #{email}
        </select>
        <select id="selectUser" resultType="User">
            select * from user
        </select>
    </mapper>
    

    6.这是controlller代码

    @Controller
    @RequestMapping("/blog/api")
    public class MainController {
    
        @Autowired(required = false)
        private UserService service;
    
        private Logger logger = Logger.getLogger(MainController.class);
    
        @RequestMapping(value = "/check", method = RequestMethod.POST)
        @ResponseBody
        @CrossOrigin
        public Result check() {
            logger.info("MainController run");
            Result result = null;
            User user = service.selectUser();
            //String name = user.getAcct();
            result = new Result();
            result.setMessage("账号");
            return result;
        }

    配置文件

    <?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:tx="http://www.springframework.org/schema/tx"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/tx
                               http://www.springframework.org/schema/tx/spring-tx.xsd
                               http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                                http://www.springframework.org/schema/context
                                 http://www.springframework.org/schema/context/spring-context.xsd"
           default-lazy-init="true">
    
    
        <context:annotation-config/>
        <!--扫描全包-->
        <context:component-scan base-package="com.blog.*"/>
        <!--加载数据库文件-->
        <context:property-placeholder location="classpath:jdbc.properties"/>
    
        <!-- 写数据源 -->
        <!--配置dataSource对象,然后通过配置到transactionManager中-->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${jdbc.Driver}"/>
            <property name="url" value="${jdbc.jdbcUrl}"/>
            <property name="username" value="${jdbc.user}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
    
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <tx:annotation-driven proxy-target-class="false" transaction-manager="transactionManager" />
    
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!--导入mapper-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="service.blog.mybatis.mapper"/>
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        </bean>
    
        <!--配置mybatis配置文件-->
        <!--配置sqlmapper.xml配置文件-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="configLocation" value="classpath:/mybatis-config.xml"/>
            <property name="mapperLocations" value="classpath:com/blog/mybatis/mapper/*.xml"/>
        </bean>
    
        <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg index="0" ref="sqlSessionFactory"/>
            <constructor-arg index="1" value="BATCH"/>
        </bean>
    
    </beans>

     

    User user = service.selectUser(); 这里为null说明service没有自动装入

    ssm? 你的xml为什么是这样的 注入失败

    查看是否开启注解扫描, xml配置文件中是否配置了自动注入

    把serviceimpl中的Autowired换成true