各位大虾救命呀,我在工程文件中编写了个userdao用于进行数据库操作,在spring的配置文件beans.xml中做了配置,可老出问题Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in file [E:\myjava\eclipse\NetShop\WebRoot\WEB-INF\beans.xml]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: net/sf/hibernate/SessionFactory
java.lang.NoClassDefFoundError: net/sf/hibernate/SessionFactory
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getDeclaredMethods(Unknown Source)
at java.beans.Introspector$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.beans.Introspector.getPublicDeclaredMethods(Unknown Source)
at java.beans.Introspector.getTargetMethodInfo(Unknown Source)
at java.beans.Introspector.getBeanInfo(Unknown Source)
at java.beans.Introspector.getBeanInfo(Unknown Source)
at java.beans.Introspector.getBeanInfo(Unknown Source)
at java.beans.Introspector.<init>(Unknown Source)
at java.beans.Introspector.getBeanInfo(Unknown Source)
at org.springframework.beans.CachedIntrospectionResults.<init>(CachedIntrospectionResults.java:150)
at org.springframework.beans.CachedIntrospectionResults.forClass(CachedIntrospectionResults.java:87)
at org.springframework.beans.BeanWrapperImpl.setIntrospectionClass(BeanWrapperImpl.java:237)
at org.springframework.beans.BeanWrapperImpl.setWrappedInstance(BeanWrapperImpl.java:195)
at org.springframework.beans.BeanWrapperImpl.setWrappedInstance(BeanWrapperImpl.java:179)
at org.springframework.beans.BeanWrapperImpl.<init>(BeanWrapperImpl.java:132)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:487)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:362)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:233)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:145)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:283)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:313)
at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:89)
at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:74)
at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:65)
at com.ke.netshop.util.Test.main(Test.java:16)我的benas.xml<!--  hibernate datasource
  --> 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" lazy-init="default" autowire="default" dependency-check="default">
  <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
  <property name="url" value="jdbc:mysql://localhost:3306/netshop" /> 
  <property name="username" value="root" /> 
  <property name="password" value="123" /> 
  <property name="maxActive" value="20" /> 
  <property name="maxIdle" value="10" /> 
  <property name="initialSize" value="1" /> 
  <property name="maxWait" value="1000" /> 
  <property name="defaultAutoCommit" value="true" /> 
  <property name="removeAbandoned" value="true" /> 
  <property name="removeAbandonedTimeout" value="60" /> 
  <property name="logAbandoned" value="true" /> 
  </bean>  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" lazy-init="default" autowire="default" dependency-check="default">
  <property name="dataSource" ref="dataSource" /> 
 <property name="mappingResources">
<list>
  <value>com/ke/netshop/model/User.hbm.xml</value> 
  
  </list>
  </property>
<property name="hibernateProperties">
 <props>
  <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
  <prop key="hibernate.hbm2ddl.auto">update</prop> 
  <prop key="hibernate.jdbc.batch_size">20</prop> 
  </props>
  </property>
  </bean>
  
<!--  Generic DAO - can be used when doing standard CRUD 
  --> 
  <bean id="userDao" class="com.ke.netshop.dao.UserDao">
    <property name="sessionFactory" ref="sessionFactory" /> 
  </bean>
UserDao文件
package com.ke.netshop.dao;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
import org.springframework.orm.hibernate3.HibernateTemplate;
import com.ke.netshop.model.User;
public class UserDao extends HibernateDaoSupport{
public boolean save(User user){
boolean bool;
try {
this.getHibernateTemplate().save(user);
bool=true;
} catch (Exception e) {
// TODO: handle exception
bool=false;
}
return bool;
}
}User.hbm.xml文件
<class name="com.ke.netshop.model.User" table="user" catalog="netshop">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="45" not-null="true" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="45" not-null="true" />
        </property>
        <property name="email" type="java.lang.String">
            <column name="email" length="45" not-null="true" />
        </property>
    </class>数据表中id是int型,auto_increment用于测试的类public class Test { public static void main(String args[]){

ApplicationContext context=new FileSystemXmlApplicationContext("WebRoot/WEB-INF/beans.xml");
try {BasicDataSource ds=(BasicDataSource) context.getBean("dataSource");
UserDao userDao=(UserDao)context.getBean("userDao");
System.out.println("file inits success!");
} catch (Exception e) {
// TODO: handle exception
System.out.println("file inits failed!");
}
}
}
可老是出现Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' 这些信息
我在测试类中获取dataSource的时候是可以的,还用dataSource成功进行了数据库操作。
不过为什么我的userDao无法创建呢?

解决方案 »

  1.   

    楼主确定JAR包全导进来了吗?
      

  2.   

        全部都导入了,我是用myeclipse的,在工程里面已经添加了spring支持,hibernate支持了,struts支持
    我原来的userDao是Struts中Action的一个属性,但是我运行的时候老出错,所以我就不用
    web测试了,改用一般的main方法测试(用这个方法时我把Action中的Property参数删除了,
    所以排除struts的影响了),
    <bean name="/login" class="com.ke.netshop.action.LoginAction"
       abstract="false" singleton="true" lazy-init="default"
       autowire="default" dependency-check="default">   
      </bean>
    可是也不行
    不过当我把以下的删除以后
    <bean id="userDao" class="com.ke.netshop.dao.UserDao">
        <property name="sessionFactory" ref="sessionFactory" /> 
      </bean>
    beanx.xml就可以正常加载了,可问题出在哪里呢
      

  3.   

       我尝试了下获取sessionFactory不过居然不行,哎
    public class Test {
    public static void main(String args[]){

    ApplicationContext context=new FileSystemXmlApplicationContext("WebRoot/WEB-INF/beans.xml");
    try {
    LocalSessionFactoryBean sessionFactory=(LocalSessionFactoryBean) context.getBean("sessionFactory");
    System.out.println("file inits success!");
    } catch (Exception e) {
    // TODO: handle exception
    System.out.println("file inits failed!");
    }
    }
      结果输出file inits failed!
    那应该是sessionFactory配置有问题了,不过错在哪里呢,难道我的jar包没导入完么,可是
    我都添加了Hibernate,Spring支持了,应该没问题呀,mysql驱动也添加了
      

  4.   

    net/sf/hibernate/SessionFactory是hiberante2.1的jar包。
    应该是有一个hiberntae2.1的包没有加载过来,建议楼主去加载下!
      

  5.   

       是么,那如果用Hibernate3的包不行么,我以上的配置错在哪里呢
       用Hibernate3的全部配置是怎么样的呢,麻烦指教
      

  6.   

        真的很奇怪耶,我看了下参考书,改了UserDao的代码放弃了对HibernateDaoSupport的继承,居然可以了!
       package com.ke.netshop.dao;
    import org.hibernate.SessionFactory;
    import org.springframework.orm.hibernate.support.HibernateDaoSupport;
    import org.springframework.orm.hibernate3.HibernateTemplate;
    import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
    import com.ke.netshop.model.User;
    public class UserDao{
    private SessionFactory sessionFactory;
    private HibernateTemplate hibernateTemplate=null;
    public void setSessionFactory(SessionFactory sessionFactory){
    this.sessionFactory=sessionFactory;
    }
    public HibernateTemplate getHibernateTemplate(){
    if(hibernateTemplate==null){
    hibernateTemplate=new HibernateTemplate(sessionFactory);
    }
    return hibernateTemplate;
    }
    public boolean save(User user){
    boolean bool;
    try {
    this.getHibernateTemplate().save(user);
    bool=true;
    } catch (Exception e) {
    // TODO: handle exception
    bool=false;
    }
    return bool;
    }
        哪位牛人能否解释下原因啊,另外还想问的是HIbernateTemplate的save方法中的参数,比如说此例中的
        user,必须全部设置了属性(name,password,email)才行么,我只设置name,结果数据库没有更新,
       有没有哪个函数是不管user中的属性已经设置了多少个都可以实现更新的函数呢?是不是要用Hql语言解决呢?
      

  7.   

    我也遇到了这样的问题,它总是提示sessionFactory无法创建,
      

  8.   

    我找到方法了,原因是 Spring 和 Hibernate 共用的一些 jar 文件发生了版本冲突, 删除发布后的目录下的 WEB-INF/lib/asm-2.2.3.jar 就可以解决这个问题了
      

  9.   

    UserDao文件 
    package com.ke.netshop.dao; 
    import org.springframework.orm.hibernate.support.HibernateDaoSupport; import org.springframework.orm.hibernate3.support.HibernateDaoSupport;