[英]No Hibernate Session bound to thread
I am using Spring MVC and Hibernate. 我正在使用Spring MVC和Hibernate。
I want to use the OpenSessionInViewFilter to allow lazy loading to work properly in the view layer. 我想使用OpenSessionInViewFilter来允许延迟加载在视图层中正常工作。
The OpenSessionInViewFilter requires a root application context so i added a ContextLoaderListener and moved my non view related configuration files to it from the DispatcherServlet. OpenSessionInViewFilter需要一个根应用程序上下文,所以我添加了一个ContextLoaderListener并将我的非视图相关配置文件从DispatcherServlet移到它。
The app-config.xml config file contains the datasource related beans. app-config.xml配置文件包含与数据源相关的bean。
When i load the app-config.xml using the ContextLoaderListener instead of DispatcherServlet, i get the error message 当我使用ContextLoaderListener而不是DispatcherServlet加载app-config.xml时,我收到错误消息
WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/XXXX/app/jobs] in DispatcherServlet with name 'Spring MVC Dispatcher Servlet'
UPDATE: fixed this error by adding a component-scan to mvc-config.xml 更新:通过向mvc-config.xml添加组件扫描来修复此错误
but now i get 但现在我明白了
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
My understanding is that DispatcherServlet inherits beans from the root context, so moving definitions from the servlet to the root context should make no difference. 我的理解是DispatcherServlet从根上下文继承bean,因此将定义从servlet移动到根上下文应该没有区别。
web.xml web.xml中
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/app-config.xml
/WEB-INF/spring/other-config.xml
</param-value>
</context-param>
<!-- Handles all requests into the application -->
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/mvc-config.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Maps all /app requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
app-config.xml APP-config.xml中
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!--
Scans within the base package of the application for @Components to
configure as beans
-->
<context:component-scan base-package="com.mycompany.app" />
<!-- SQL Server -->
<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver" />
<property name="url" value="jdbc:jtds:sqlserver://x.x.x.x/XXX" />
<property name="username" value="XXX" />
<property name="password" value="XXX" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="datasource" />
<property name="configLocation">
<value>/WEB-INF/hibernate.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<value>hibernate.dialect=org.hibernate.dialect.SQLServerDialect</value>
</property>
</bean>
<tx:annotation-driven />
<bean name="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
mvc-config.xml MVC-config.xml中
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- Configures support for @Controllers -->
<mvc:annotation-driven />
<context:component-scan base-package="com.mycompany.app" />
<bean id="tilesConfigurer"
class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/defs/general.xml</value>
</list>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.tiles2.TilesView" />
</bean>
</beans>
One possible problem I can see here is that openSessionInViewFilter
is mapped after UrlRewriteFilter
. 我在这里看到的一个可能的问题是在UrlRewriteFilter
之后映射了openSessionInViewFilter
。 UrlRewriteFilter
performs RequestDispatcher.forward()
, therefore all filters mapped after it should have <dispatcher>FORWARD</dispatcher>
: UrlRewriteFilter
执行RequestDispatcher.forward()
,因此在它之后映射的所有过滤器都应该有<dispatcher>FORWARD</dispatcher>
:
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<tx:annotation-driven />
only covers the local context in which it is defined. <tx:annotation-driven />
仅涵盖定义它的本地上下文。 In this case, it will cover the beans in app-config.xml, since that's the only place I see it in your configuration. 在这种情况下,它将覆盖app-config.xml中的bean,因为这是我在配置中看到它的唯一位置。
Depending on where your transactions are defined (and based on your error I'm assuming they're defined in beans within the mvc-config.xml context), this could result in @Transactional classes or methods which aren't wired with Spring's transaction management. 根据您的事务定义的位置(并且基于您的错误,我假设它们是在mvc-config.xml上下文中的bean中定义的),这可能导致@Transactional类或方法与Spring的事务无关管理。
My guess is you need to add <tx:annotation-driven />
to your mvc-config.xml. 我的猜测是你需要将<tx:annotation-driven />
到你的mvc-config.xml中。
The following is from the Spring Reference : 以下是来自Spring Reference :
<tx:annotation-driven/>
only looks for@Transactional
on beans in the same application context it is defined in. This means that, if you put<tx:annotation-driven/>
in aWebApplicationContext
for aDispatcherServlet
, it only checks for@Transactional
beans in your controllers, and not your services.<tx:annotation-driven/>
仅查找在其定义的相同应用程序上下文中的bean上的@Transactional
。这意味着,如果在WebApplicationContext
为DispatcherServlet
放置<tx:annotation-driven/>
,它只会检查对于控制器中的@Transactional
bean,而不是您的服务。 See Section 15.2, “The DispatcherServlet” for more information. 有关更多信息,请参见第15.2节“DispatcherServlet” 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.