我的项目是SSH项目,在action中调用getHibernateTemplate().save()方法时出错,说空指针异常,我打印了Session,发现没得到,是哪里出了问题啊,我是写了一个类实现HibernateDaoSupport的,然后就直接调用getHibernateTemplate().save()就出错了,请教大家

解决方案 »

  1.   

    这是我的spring配置文件<?xml version="1.0" encoding="UTF-8"?>
    <beans default-autowire="byName"
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    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-2.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-2.0.xsd" default-lazy-init="true">  <bean id="conn" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:ora9"></property>
    <property name="username" value="admin"></property>
    <property name="password" value="admin123"></property>
    <property name="initialSize" value="5" />
    <property name="maxActive" value="100" />
    <property name="maxIdle" value="30" />
    <property name="maxWait" value="1000" />
    <property name="poolPreparedStatements" value="true" />
    <property name="defaultAutoCommit" value="false" />
    </bean>
     
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
    <ref bean="conn" />
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">
    org.hibernate.dialect.Oracle10gDialect
    </prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.format_sql">false</prop>
    </props>
    </property>
    <property name="mappingDirectoryLocations">
    <list>
    <value>classpath*:/com/rong/model/vo</value> 
    </list>
    </property>
    </bean>
     
     <!-- transaction -->
    <bean id="txManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
    <tx:method name="get*" propagation="SUPPORTS"
    read-only="true" />
    <tx:method name="find*" propagation="SUPPORTS"
    read-only="true" />
    <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
    </tx:advice>
    <aop:config>
    <aop:pointcut id="bizMethods"
    expression="execution(* com.rong.model.service.*.*.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" />
    </aop:config>
        
    <!-- transactionEnd -->
     
    <!-- dao -->
    <!-- service --> <bean name="/admin" class="com.rong.web.action.system.AdminAction"></bean>
    <bean name="/receiptsSelectAction" class="com.rong.web.action.system.ReceiptsSelectActionAction"></bean>
    <bean name="/pDAAdmin" class="com.rong.web.action.system.PDAAdminAction"></bean>
    <!-- action -->
     
    <bean id="XadeptDAO" class="com.rong.model.dao.XadeptDAO">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
    <bean id="pdamanagementDAO"
    class="com.rong.model.dao.PdamanagementDAO">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
    <bean id="XaunitDAO" class="com.rong.model.dao.XaunitDAO">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
      

  2.   

    成功了
    信息: Initializing WebApplicationContext for Struts ActionServlet 'action', module ''
    2010-1-12 20:32:51 org.apache.coyote.http11.Http11Protocol start
    信息: Starting Coyote HTTP/1.1 on http-8088
    2010-1-12 20:32:51 org.apache.jk.common.ChannelSocket init
    信息: JK: ajp13 listening on /0.0.0.0:8009
    2010-1-12 20:32:51 org.apache.jk.server.JkMain start
    信息: Jk running ID=0 time=0/47  config=null
    2010-1-12 20:32:51 org.apache.catalina.startup.Catalina start
    信息: Server startup in 7642 ms
    用户登陆。。
    dddddddddddddddddddddddd
    dopdaadd...
    java.lang.NullPointerException
    at com.rong.model.dao.BaseDaoImpl.save(BaseDaoImpl.java:78)
    at com.rong.model.service.ServiceImp.save(ServiceImp.java:55)
    at com.rong.web.action.system.PDAAdminAction.dopdaadd(PDAAdminAction.java:71)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
    at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.rong.util.ChineseFilter.doFilter(ChineseFilter.java:40)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)这是异常
      

  3.   

    感觉你报错没到HibernateDaoSupport。空指针自己解决吧。能力的提高就是不断的改错!
      

  4.   

    default-autowire="byName"
    去了呢
      

  5.   

    你的Service层配置了没有啊? 把DAO注入到Service里边么?正在用你说的方式开发,  你多贴些可能出现错误的地方,我给你看下,我在线。
      

  6.   

    我先介绍下我的调用过程,我是在action中调用一个service,service中调用DAO,这个DAO继承HibernateDaoSupport,spring配置文件已经注入了,
    <bean id="baseDao" class="com.rong.dao.BaseDaoImpl">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
      

  7.   

    把你Service的代码贴出来,或者你就是直接用Action层调用Dao层的
    那么请把Dao注入Action
      

  8.   

    既然是service中调用DAO那么在spring的配置文件里,你要把DAO注入service
      

  9.   


    <bean id="userDao" class="com.accp.house.dao.impl.UserDaoImpl">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean><bean id="userService" class="com.accp.house.service.impl.UserServiceImpl">
    <property name="userDao" ref="userDao"></property>
    </bean><bean name="/logine" class="com.accp.house.web.struts.action.LogineAction">
    <property name="userService" ref="userService"></property>
    </bean>
      

  10.   

    这是service在spring中配置<bean id="iservice" class="com.rong.service.ServiceImp"></bean>
    在service中调用是这样写的:IBaseDao baseDao = null;再加上set,get方法
      

  11.   

                <tx:method name="get*" propagation="SUPPORTS"
                    read-only="true" />            
                <tx:method name="find*" propagation="SUPPORTS"
                    read-only="true" />            
                <tx:method name="*" propagation="REQUIRED" />

    你是不是没根据你的命名规范命名方法名称???
      

  12.   

    我把代码贴详细些,<bean id="userDao" class="com.accp.house.dao.impl.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
    <!--UserServiceImpl中有UserDao userDao=null 以及set,get-->
    <bean id="userService" class="com.accp.house.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
        </bean>
    <!--ULogineAction中有UserService userService=null 以及set,get-->
    <bean name="/logine" class="com.accp.house.web.struts.action.LogineAction">
        <property name="userService" ref="userService"></property>
        </bean>[/code]
      

  13.   

    命名是规范的,我service中的方法就叫save(),dao中也是叫save()
      

  14.   

    <bean id="basicDao"
    class="org.springframework.orm.hibernate3.support.HibernateDaoSupport"
    abstract="true">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean><bean id="XadeptDAO" class="com.rong.model.dao.XadeptDAO" parent="basicDao">
    </bean>其余的DAO对着改下
    还有我的资源有个SSH整合视频 下了看看
      

  15.   

    错误找到了,是service注入错了,如果是接口在spring中应该怎么配置啊?
    比如我在action中声明IBaseDAO baseDAO;加上set,get方法,在spring中怎样配置,class=是写接口还是写实现类?
      

  16.   

    像public class GenericHibernateDAO<T extends Serializable, PK extends Serializable> extends HibernateDaoSupport implements GenericDAO<T, PK>这个类中有两个参数T和PK在spring中应该怎样配置,怎样把参数加进去?
      

  17.   

      你这个不就是属性注入吗?
     你这个T PK 怎么都 继承Serializable呀。
       支持属性注入应该也<T> 没关系吧它只是强调一种依赖关系(这种写法没试过。。)
      

  18.   

    public class GenericHibernateDAO <T extends Serializable, PK extends Serializable> extends HibernateDaoSupport implements GenericDAO <T, PK>这个类中有两个参数T和PK在spring中应该怎样注入啊?
      

  19.   


    package com.ts.spring;import java.io.Serializable;public class MySpring <T extends Serializable,PK extends Serializable> {
         public void test(){
          System.out.println("我拿到测试数据了");
         }
    }
    package com.ts.spring;public class MySpring2 {
    private MySpring myspring=null; public void setMyspring(MySpring myspring) {
    this.myspring = myspring;
    }
        public void test(){
         myspring.test();
        }
    public MySpring getMyspring() {
    return myspring;
    }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">   <bean id="mySpring" class="com.ts.spring.MySpring"></bean>    <bean id="mySpring2" class="com.ts.spring.MySpring2">
        <property name="myspring" ref="mySpring"></property>
        </bean>
    </beans>package com.ts.test;import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;import com.ts.spring.MySpring2;public class MyTest { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    ApplicationContext context = 
          new ClassPathXmlApplicationContext("applicationContext.xml"); 
    MySpring2 springTest=(MySpring2)context.getBean("mySpring2");
    springTest.test();
    }}
    //输出 我拿到测试数据了
      

  20.   

    说明MySpring后面的<T extends Serializable,PK extends Serializable>
       与属性方式注入无关。    属性方式注入:注入只与属性有关。只要你确定依赖关系就可以获得其实例
        Over!!!
      

  21.   

    应该是你注入的时候出错了没找到对应的名字,byName是按名字查找的你可以看一下你的名字会不会对的上,本身默认的是按byType查找的不知道你为啥要改成byName