2016-04-15 2 views
0

Я изучаю Весна и mybatis.spring can not autowire in mybatis NullPointerException

И у меня возникла проблема. В основном я участвую в officail tutorial. Но я не могу получить то, что я что.

пружина не может autowire UserMapper в ServiceImpl.

И есть исключение, которое является

java.lang.NullPointerException 

    main.java.cn.qingtianr.service.impl.UserServiceImpl.findByUserName(UserServiceImpl.java:23) 
    main.java.cn.qingtianr.action.UserAction.execute(UserAction.java:22) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:498) 
    ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:870) 
    ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1293) 
    ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68) 
    com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethodWithDebugInfo(XWorkMethodAccessor.java:117) 
    com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethod(XWorkMethodAccessor.java:108) 
    ognl.OgnlRuntime.callMethod(OgnlRuntime.java:1369) 
    ognl.ASTMethod.getValueBody(ASTMethod.java:90) 
    ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) 
    ognl.SimpleNode.getValue(SimpleNode.java:258) 
    ognl.Ognl.getValue(Ognl.java:494) 

И другой источник есть.

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:p="http://www.springframework.org/schema/p" 
     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-3.1.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-3.1.xsd 
         http://www.springframework.org/schema/mvc 
         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 

    <bean id="archivesi" class="main.java.cn.qingtianr.service.impl.ArchiveServiceImpl"/> 
    <bean id="articlesi" class="main.java.cn.qingtianr.service.impl.ArticleServiceImpl"/> 
    <bean id="usersi" class="main.java.cn.qingtianr.service.impl.UserServiceImpl"/> 

    <!--<aop:aspectj-autoproxy proxy-target-class="true" />--> 
    <!-- 自动扫描 --> 
    <!--<context:component-scan base-package="main.java.cn.qingtianr" />--> 
    <!-- 引入配置文件 --> 
    <bean id="propertyConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location" value="classpath:main/resources/jdbc.properties" /> 
    </bean> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
      destroy-method="close"> 
     <property name="driverClassName" value="${driver}" /> 
     <property name="url" value="${url}" /> 
     <property name="username" value="${username}" /> 
     <property name="password" value="${password}" /> 
     <!-- 初始化连接大小 --> 
     <property name="initialSize" value="${initialSize}"></property> 
     <!-- 连接池最大数量 --> 
     <property name="maxActive" value="${maxActive}"></property> 
     <!-- 连接池最大空闲 --> 
     <property name="maxIdle" value="${maxIdle}"></property> 
     <!-- 连接池最小空闲 --> 
     <property name="minIdle" value="${minIdle}"></property> 
     <!-- 获取连接最大等待时间 --> 
     <property name="maxWait" value="${maxWait}"></property> 
    </bean> 

    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> 
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <bean id="userdao" class="org.mybatis.spring.mapper.MapperFactoryBean"> 
     <property name="mapperInterface" value="main.java.cn.qingtianr.dao.UserDao" /> 
     <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
    </bean> 


     </beans> 

UserServiceImpl.java

package main.java.cn.qingtianr.service.impl; 

import main.java.cn.qingtianr.dao.UserDao; 
import main.java.cn.qingtianr.dbc.MybatisSqlSessionFactory; 
import main.java.cn.qingtianr.model.User; 
import main.java.cn.qingtianr.service.UserService; 

/** 
* Created by jack on 16-3-29. 
*/ 
public class UserServiceImpl implements UserService{ 

    private UserDao userdao; 

    public User findByUserName(String username) throws Exception 
    { 
     User user = null; 
     try 
     { 
      if(userdao == null){ 
       System.out.println("11111111111"); 
      } 
      user = this.userdao.findByUserName(username); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      throw e; 
     } 
     finally 
     { 
      MybatisSqlSessionFactory.closeSession(); 
     } 
     return user; 
    } 

    public UserDao getUserdao() { 
     System.out.println("It is in getUserdao"); 
     return userdao; 
    } 

    public void setUserdao(UserDao userdao) { 
     System.out.println("It is in setUserdao"); 
     this.userdao = userdao; 
    } 
} 

UserDao.java

package main.java.cn.qingtianr.dao; 

import main.java.cn.qingtianr.model.User; 

/** 
* Created by jack on 16-3-29. 
*/ 
public interface UserDao { 
    public User findByUserName(String username) throws Exception; 
} 

UserDao.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="main.java.cn.qingtianr.dao.UserDao"> 

    <select id="findByUserName" parameterType="int" resultType="main.java.cn.qingtianr.model.User"> 
     SELECT * FROM user WHERE username = #{username} 
    </select> 

</mapper> 

Если весенний автопогрузчик mybatis Mapper затем распечатает It is in setUserdao или getUserdao в UserServiceImpl.java.

Но есть ничего, кроме 11111111, когда userdao - null.

Может ли кто-нибудь мне помочь? спасибо.

+0

Spring * «не может autowire» *, потому что ты не говоришь его - вы должны добавить '@ Autowired' выше либо' частных UserDao userdao; 'или' public void setUserdao (UserDao userdao) {'. Поскольку вы уже используете XML, вы также можете указать его как свойство ' kryger

+0

Думайте, что вы. Но я добавляю '@ Autowired' над' private UserDao userdao', есть одно и то же исключение. – jack

+0

Это потому, что вы закомментировали «компонент-сканирование». Обратите внимание, что MyBatis не относится к вашему вопросу, вы можете легко найти ответы здесь на SO или, желательно, официальную документацию Spring. – kryger

ответ

0
<bean id="usersi" class="main.java.cn.qingtianr.service.impl.UserServiceImpl"> 
    <property name="userdao" ref = "userdao"/> 
</bean > 
+0

Это работает для меня. Спасибо – jack

-1

Вы не устанавливаете компонент userDao в свой bei-компонент. Посмотрите здесь для получения дополнительной информации: http://www.mybatis.org/spring/mappers.html

+0

да! Теперь я могу понять, что сказал сайт. – jack

Смежные вопросы