2012-06-05 3 views
0

Я пытаюсь использовать Hibernate при попытке открыть сеанс, я получаю следующее исключениеHibernate исключение: Нет Hibernate Session не связан с Thread

org.springframework.web.util.NestedServletException: Request processing failed; nested 
exception is org.hibernate.HibernateException: No Hibernate Session bound to thread,   
and configuration does not allow creation of non-transactional one here 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:656) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) 
    com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) 

root cause 

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 
    org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63) 
    org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:622) 
    com.dataart.masternoy.dao.imp.UserDAOImpl.existUserByLoginEmail(UserDAOImpl.java:35) 
    com.dataart.masternoy.service.imp.UserServiceImpl.existUserByLoginMail(UserServiceImpl.java:47) 
    com.dataart.masternoy.controller.FirstPageController.isValid(FirstPageController.java:46) 
    com.dataart.masternoy.controller.FirstPageController.ConfirmRegister(FirstPageController.java:79) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) 
    com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) 

вот мой конфиг

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"  xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"   
    default-lazy-init="true"> 
    <import resource="applicationContext-services.xml" /> 
    <import resource="applicationContext-security.xml" /> 
    <import resource="applicationContext-email.xml" /> 
    <import resource="applicationContext-social.xml" /> 

    <mvc:resources mapping="/resources/**" location="/resources/" /> 

    <mvc:annotation-driven /> 
    <context:component-scan base-package="com.company.name." /> 
    <bean id="validator" 
     class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> 

    <bean id="viewResolver" 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/pages/" /> 
     <property name="suffix" value=".jsp" /> 
     <property name="contentType" value="text/html; charset=UTF-8" /> 
    </bean> 

    <bean id="messageSource" 
      class="org.springframework.context.support.ResourceBundleMessageSource"> 
     <property name="basename" value="messages" /> 
     <property name="useCodeAsDefaultMessage" value="true" /> 
    </bean> 

    <bean id="jacksonMessageConverter" 
      class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
    </bean> 
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
     <property name="messageConverters"> 
     <list> 
     <ref bean="jacksonMessageConverter" /> 
     </list> 
     </property> 
    </bean> 
</beans> 

Dispatcher Servlet

<?xml version="1.0" encoding="UTF-8"?> 
<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:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util" 
    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 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 

    <mvc:annotation-driven /> 
    <context:component-scan base-package="com.company.name" /> 
    <mvc:resources mapping="/resources/**" location="/resources/" /> 
    <!-- 
    <mvc:view-controller path="/error/" view-name="errors/error" /> 
    <mvc:view-controller path="/403/" view-name="errors/403" /> 
    <mvc:view-controller path="/404/" view-name="errors/404" /> 
    <mvc:view-controller path="/405/" view-name="errors/405" /> 
    --> 
</beans> 

Услуги

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd" 
    default-lazy-init="true"> 

    <!-- <tx:annotation-driven transaction-manager="txManager" /> --> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
    <bean id="configProperties" class="com.dataart.masternoy.utils.PropertiesUtil"> 
     <property name="ignoreUnresolvablePlaceholders" value="true" /> 
     <property name="locations"> 
     <list> 
      <value>classpath:/config.properties</value> 
      <value>classpath:/jdbc.properties</value> 
     </list> 
     </property> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/shop" /> 
     <property name="username" value="root" /> 
     <property name="password" value="root" /> 
    </bean> 
    <bean id="dataSourceNew" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 

     <!-- <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> --> 
     <property name="url" value="jdbc:mysql://localhost:3306/shop" /> 
     <property name="username" value="root" /> 
     <property name="password" value="root" /> 

    </bean> 
    <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate"> 
     <constructor-arg ref="dataSource" /> 
    </bean> 

    <bean id="txManager" 
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 
    <bean id="sessionFactory" 
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
      lazy-init="true"> 
     <property name="dataSource" ref="dataSourceNew" /> 
     <property name="packagesToScan" value="com.company.name" /> 
     <property name="configLocation"> 
     <value>classpath:hibernateConfig.xml</value> 
     </property> 
     <property name="configurationClass"> 
     <value>org.hibernate.cfg.AnnotationConfiguration</value> 
     </property> 
     <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop> 
      <prop key="hibernate.connection.charSet">UTF-8</prop> 
      <prop key="current_session_context_class">thread</prop> 
      <prop key="format_sql">true</prop> 
     </props> 
     </property> 
    </bean> 
</beans> 

И serviceImpl

@Service(value = "userService") 
public class UserServiceImpl implements UserService { 
@Autowired 
@Qualifier("UserDAO") 
UserDAO userDAO; 

@Transactional 
public void addNewUser(User user) { 
    userDAO.insertNewUser(user); 
} 
@Transactional(readOnly = true) 
public User getUserByLogin(String login) { 
    return userDAO.selectUserByLogin(login); 
} 
@Transactional(readOnly = true) 
public List<User> getUserList() { 
    return userDAO.getUserList(); 
} 
@Transactional 
public void removeUserByLogin(String login) { 
    userDAO.deleteUserByLogin(login); 
} 
@Transactional(readOnly = true) 
public Boolean existUserByLoginMail(String login, String email) { 
    return userDAO.existUserByLoginEmail(login, email); 
} 
@Transactional(readOnly = true) 
public User getUserByID(Long ID) { 
    return (User) userDAO.selectUserByID(ID); 
} 
@Transactional(readOnly = true) 
public User getUserByLoginPass(String login, String pass) { 
    return userDAO.getUserByLoginPass(login, pass); 
} 
} 
+0

Возможный дубликат [Hibernate @Transactional Sessions] (http://stackoverflow.com/questions/10895451/hibernate-transactional-sessions). У вас есть ответ на другой идентичный вопрос, который вы задали, и вы даже приняли ответ. Почему вы снова спрашиваете его? –

+0

Нет, это не проблема. Теперь он развертывается, но не может открыть сеанс. –

ответ

3

Вот мое предположение. В приложении Spring MVC контекст, используемый сервлет диспетчера, является дочерним элементом глобального контекста. Поэтому, если вы сконфигурируете одни и те же компоненты в этом дочернем контексте, как те, которые настроены в глобальном контексте, дочерние контекстные компоненты будут переопределять глобальные.

Это, вероятно, то, что вы сделали, а это означает, что вы получаете ссылку на UserService, созданный с помощью дочернего контекста, где нет диспетчера транзакций, вместо того, чтобы получать ссылку на UserService, созданный в глобальном контексте, диспетчер транзакций.

Убедитесь, что только сканировать MVC связанных бобов в вашем контексте MVC, изменив

<context:component-scan base-package="com.company.name" /> 

в

<context:component-scan base-package="com.company.name.web" /> 

или

<context:component-scan base-package="com.company.name"> 
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 
</context:component-scan> 

, например.

+0

Какой пакет com.company.name.web? –

+1

Вымышленный пакет, в котором у вас есть все ваши материалы, связанные с MVC, и ни одна из ваших служб и DAO. Повторно прочитав трассировку стека, это может быть com.company.name.controller. –

+0

Хмм я попробую сейчас –

Смежные вопросы