2016-04-15 12 views
0

Ich lerne Spring und mybatis.Feder kann nicht automatisch in mybatis NullPointerException

Und ich stieß auf ein Problem.Ich lerne hauptsächlich von officail tutorial. Aber ich kann nicht bekommen, was ich was.

Die Feder UserMapper in ServiceImpl nicht autowire kann.

Und es gibt eine Ausnahme, die

ist
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) 

Und andere Quelle gibt.

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> 

Wenn spring autowire mybatis Mapper dann wird It is in setUserdao oder getUserdao in UserServiceImpl.java drucken.

Aber es gibt nichts außer 11111111, wenn userdao Null ist.

Also kann mir jemand helfen? Danke.

+0

Frühling * „kann nicht autowire“ *, weil Sie es nicht zu sagen - Sie '@ Autowired' hinzufügen müssen über entweder' privaten UserDao userdao; 'oder' public void setUserdao (UserDao userdao) {'. Da Sie XML bereits verwenden, könnten Sie es auch als eine Eigenschaft von ' kryger

+0

Ich denke du. Aber ich füge '@ Autowired' über 'private UserDao userdao' hinzu, es gibt die gleiche Ausnahme. – jack

+0

Dies liegt daran, dass Sie den 'component-scan' auskommentiert haben. Beachten Sie, dass MyBatis für Ihre Frage nicht relevant ist. Sie können die Antworten hier auf SO oder vorzugsweise in der offiziellen Dokumentation von Spring finden. – kryger

Antwort

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

Es funktioniert für mich. Danke – jack

-1

Sie setzen die UserDao-Bean nicht in Ihrer Benutzerdefinition. Werfen Sie einen Blick hier für weitere Informationen: http://www.mybatis.org/spring/mappers.html

+0

Yeah, jetzt kann ich verstehen, was die Seite gesagt hat. – jack