【问题标题】:hibernate sessionFactory not found but bean loaded未找到休眠 sessionFactory 但已加载 bean
【发布时间】:2012-12-18 17:53:04
【问题描述】:

我已经搜索了互联网并调试了几个小时,但我一直在寻找问题所在。 我有以下网络应用程序设置: 码头 8.1.0.v20120127 Spring-orm 3.1.2.RELEASE Spring-web 3.1.2.RELEASE Hibernate-core 4.1.7-final

在通过 sessionFactoryBeanName init-param 定义的 web.xml 中:hibernateSessionFactory

当应用程序启动时没有错误并显示以下内容:

XmlWebApplicationContext:从 applicationContext.xml 加载一些 bean ClassPathXmlApplicationContext:从applicationContext-hibernate.xml(也是hibernateSessionFactory)加载一些bean

当加载一个页面(请求)时,OpenSessionInViewFilter 被激活并给出以下信息:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'hibernateSessionFactory' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1095)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:277)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1102)
at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.lookupSessionFactory(OpenSessionInViewFilter.java:156)
at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.lookupSessionFactory(OpenSessionInViewFilter.java:141)
at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:105)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1336)
at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:172)
at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:267)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1336)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:483)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:521)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:412)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
at org.eclipse.jetty.server.Server.handle(Server.java:351)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:451)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:916)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:634)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:76)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:609)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:45)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534)
at java.lang.Thread.run(Thread.java:722)

在 DefaultListableBeanFactory.java:553 上调试时,beanDefinitionMap 显示了一个键集,其中只有加载了 XmlWebApplicationContext 的 bean。因此没有显示文件 applicationContext-hibernate.xml 中的任何 bean。

bean 定义(LocalSessionFactoryBean 的设置器之一上的断点显示 bean 已创建):

<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="configLocations" ref="hibernateConfigLocations"/>
<property name="dataSource" ref="hibernateDatasource"/>
<property name="namingStrategy" ref="hibernateNamingStrategy"/>
<property name="hibernateProperties" ref="hibernateProperties"/>

我期待从 XmlWebApplicationContext 和 ClassPathXmlApplicationContext 中找到所有 bean。任何人都可以告诉我是什么导致了我的问题,如果缺少任何有关发现问题的信息,请告诉我?

web.xml:

<display-name>webshop-cms</display-name>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<context-param>
    <param-name>configuration</param-name>
    <param-value>deployment</param-value>   
</context-param>

<filter>
    <filter-name>webshop-cms</filter-name>
    <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
    <init-param>
        <param-name>applicationClassName</param-name>
        <param-value>nl.name.webshop.cms.CmsApplication</param-value>
    </init-param>
    <init-param>
        <param-name>ignorePaths</param-name>
        <param-value>/assets</param-value>
    </init-param>
</filter>

<filter>
    <filter-name>openSessionInView</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>hibernateSessionFactory</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>webshop-cms</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>openSessionInView</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

applicationContext.xml:

<context:component-scan base-package="nl.name.webshop.model" />
<context:component-scan base-package="nl.name.webshop.service" />
<context:component-scan base-package="nl.name.webshop.dao" />

<bean id="webshop.context" class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg>
        <list>
            <value>classpath:applicationContext-hibernate.xml</value>
        </list>
    </constructor-arg>
</bean>

applicationContext-hibernate.xml:

<bean id="hibernateNamingStrategy" class="org.hibernate.cfg.DefaultComponentSafeNamingStrategy" />

<bean id="hibernateConfigLocations" class="java.util.ArrayList">
    <constructor-arg>
        <list>
            <value>classpath:hibernate.cfg.xml</value>
        </list>
    </constructor-arg>
</bean> 

<bean id="jndiDatasourceName" class="java.lang.String">
    <constructor-arg value="java:comp/env/jdbc/webshop"/>
</bean>

<jee:jndi-lookup id="hibernateConfig" jndi-name="jdbc/webshop-hibernate-config"/>
<jee:jndi-lookup id="hibernateDatasource" jndi-name="jdbc/webshop-datasource"/>

<bean id="hibernatePropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="properties" ref="hibernateConfig"/>
</bean>

<bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
        </props>
    </property>
</bean>

<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="configLocations" ref="hibernateConfigLocations"/>
    <property name="dataSource" ref="hibernateDatasource"/>
    <property name="namingStrategy" ref="hibernateNamingStrategy"/>
    <property name="hibernateProperties" ref="hibernateProperties"/>
</bean>

【问题讨论】:

  • 你能告诉我们你的加载弹簧上下文文件的配置吗?
  • 抱歉,这是我的第一篇文章,只是无法正确获取代码块。我会再试一次。
  • Oké 添加了文件.. 希望很明显 de start xml 标签也消失了,我认为每个文件的最后一个关闭标签

标签: spring hibernate sessionfactory


【解决方案1】:

你的 bean 的定义不应该是:

<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

即使用 id 属性而不是 name。

[编辑] 实际上,是否有理由以这种方式加载 applicationContext-hibernate.xml 文件:

<bean id="webshop.context" class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg>
        <list>
            <value>classpath:applicationContext-hibernate.xml</value>
        </list>
    </constructor-arg>
</bean>

我认为您可以在 applicationContext.xml 中简单地包含以下内容:

<import resource="/path/relative/to/application/context/applicationContext-hibernate.xml"/>

【讨论】:

  • JamesB 感谢您的回答。我不知道spring是如何处理id和name属性的。但我将其更改为 id ,不幸的是它并没有解决我的问题。我不知道为什么我只对这个 bean 使用 name 属性。所以我现在使用 id 来保持一致。
猜你喜欢
  • 2019-04-13
  • 2016-06-28
  • 2020-03-10
  • 2012-01-23
  • 2016-03-21
  • 2013-06-11
  • 2015-06-10
  • 2021-09-08
  • 1970-01-01
相关资源
最近更新 更多