java 异常问题 No bean named 'sessionFactory' is defined

来源:互联网 发布:淘宝网怎么开店步骤 编辑:程序博客网 时间:2024/04/28 16:44

今天启动tomcat 后  在浏览器输入地址后  出现如下问题:之前还好好的。
exception

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sessionFactory' is defined
    org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:338)
    org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:870)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:237)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
    org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:644)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.lookupSessionFactory(OpenSessionInViewFilter.java:218)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.lookupSessionFactory(OpenSessionInViewFilter.java:202)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:146)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:413)
    com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
    com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
    org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:78)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)

初步问题是:找不到org.springframework.beans.factory  下 bean  'sessionFactory' 郁闷!
首先在web-xml 配置了application*.xml加载路劲。

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/spring/application*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>

当web.xml加载时  延迟加载spring的配置文件application*.xml
在applicationContext.xml中含有bean 为SeesionFactory
如下:
<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
................/>
路劲没问题,应该就能找到bean 为 seesionFactory  不知为什么?


在网上搜索了一通,发现OpenSessionInViewFilter可能引起这个异常。
异常说明:sessionFactory bean未定义
异常原因:applicationContext.xml配置文件中使用其他名字sessionFactory
在web.xml的位置如下
     <filter>
        <filter-name>hibernateFilter</filter-name>
        <filter-class>
            org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
        </filter-class>
        <init-param>
       
            <param-name>singleSession</param-name>   
            <param-value>false</param-value>
           
            <!--<param-name>sessionFactoryBeanName</param-name>  
            <param-value>sessionFactory</param-value> --> 
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>hibernateFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

OpenSessionInViewFilter的主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。目的是为了实现"Open Session in View"的模式。例如:它允许

在事务提交之后延迟加载显示所需要的对象。
 OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 Spring 的事务管理器探测到。所以 OpenSessionInViewFilter 适用于 Service 层使

用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也可以用于非事务只读的数据操作中。
而我的applicationContext-dao.xmlz中的
<bean id="accountDAO" class="com.dbw.cms.dao.hibernate.AccountDAOImpl">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>
</bean>
是使用sessionFactory啊,没错。可是他还是没找到bean  为sessionFactory 晕!

最后发现我WEB-INF下面lib文件夹下文件没有了 也就说很多包文件丢失 ,可能我代码同步更新的时候,jdk的路劲和其他的不一样
jdk安装的时候  有JAVA_HOME PATH CLASSPATH
具体作用:path和classpath的作用:path是为JDK提供的那些工具设的,如java.exe,javac.exe,而classpath是为 Java程序所用到的库文件所设的,于是path设成:java_home

/bin;而classpath设为:java_home/jre/lib /rt.jar,如果我们开发的一个应用中用到了非j2se提供的库文件,则需将这些文件加到classpath中,比如说利用javamail开发一个邮

件应用,就应该把mail.jar
等文件加到classpath中:java_home/jre/lib/ext/mail.jar;.
如果一台PC上装了几个JRE,那么就要注意了,有时很容易产生问题,很可能我们用来编译Java程序的javac.exe所相关的JRE与运行程序时所用的JRE不是一个版本, 这可能会产生

版本冲突,这可以通过设定path变量来解决。

最后应用中的第三方文件应该加到java_home/jre/lib/ext下
而我之前的WEB-INF下面lib文件夹下文件没有任何第三包  可能是JDK的问题,结果尝试了重新配置了本机的JDK后  ,果然问题解决!