异常是org.hibernate.HibernateException:没有Hibernate Session绑定到线程

时间:2013-04-12 16:31:03

标签: hibernate java-ee spring-mvc

我的数据库输入数据有问题吗? spring mvc project

你能给我一些解决方案吗?

这是一个错误:

SEVERE: Servlet.service() for servlet [appServlet] in context with path [/pow] threw 
exception [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] with root cause
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean$TransactionAwareInvocationHandler.invoke(LocalSessionFactoryBean.java:960)
    at $Proxy11.getCurrentSession(Unknown Source)
    at com.project.dao.LoginDaoImpl.saveUser(LoginDaoImpl.java:37)
    at com.project.service.LoginServiceImpl.saveUser(LoginServiceImpl.java:30)
    at com.project.controller.LoginController.registration(LoginController.java:106)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:91)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

我在我的DAO和我的服务中添加了@Transactional注释。

servlet的context.xml中

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">


    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    <context:annotation-config />
    <context:component-scan base-package="com.project.controller, com.project.dao, com.project.service"  use-default-filters="true"/>

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />
    <resources mapping="/resources/gfx/**" location="/resources/gfx/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>




    <!--title beans -->

<!--
<beans:bean class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"/>
<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <beans:property name="definitions">
        <beans:list>
            <beans:value>/WEB-INF/spring/appServlet/titles.xml</beans:value>
        </beans:list>
    </beans:property>
</beans:bean> 
-->



    <!--hibernate beans -->

      <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
                        <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
                        <beans:property name="url" value="jdbc:mysql://localhost:3306/mydb" />
                        <beans:property name="username" value="root" />
                        <beans:property name="password" value="admin" />
                        <beans:property name="initialSize" value="3" />
                        <beans:property name="maxActive" value="10" />
        </beans:bean>




<beans:bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="/WEB-INF/jdbc.properties" />

 <beans:bean id="messageSource"

    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

    <beans:property name="basename" value="/WEB-INF/messages" />
</beans:bean>



<beans:bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <beans:property name="dataSource" ref="dataSource" />
            <beans:property name="annotatedClasses">
            <beans:list>
                <beans:value>com.project.data.DodatkowiProwadzacy</beans:value>
                <beans:value>com.project.data.GrupyProjektowe</beans:value>
                <beans:value>com.project.data.GrupyZajeciowe</beans:value>
                <beans:value>com.project.data.Kursy</beans:value>
                <beans:value>com.project.data.LaczenieNotatekIPlikow</beans:value>
                <beans:value>com.project.data.Notatki</beans:value>
                <beans:value>com.project.data.Obecnosc</beans:value>
                <beans:value>com.project.data.OcenyCzastkowe</beans:value>
                <beans:value>com.project.data.Pliki</beans:value>
                <beans:value>com.project.data.PozwoleniaNaLaczenia</beans:value>
                <beans:value>com.project.data.Prowadzacy</beans:value>
                <beans:value>com.project.data.Spotkania</beans:value>
                <beans:value>com.project.data.Studenci</beans:value>
                <beans:value>com.project.data.StudenciDoGrupProjektowych</beans:value>
                <beans:value>com.project.data.StudenciDoGrupZajeciowych</beans:value>
            </beans:list>
        </beans:property>

         <beans:property name="configurationClass">
            <beans:value>org.hibernate.cfg.AnnotationConfiguration</beans:value>
        </beans:property> 


        <beans:property name="hibernateProperties">
            <beans:props>
                <beans:prop key="current_session_context_class">thread</beans:prop>
                <beans:prop key="hibernate.dialect">${jdbc.dialect}</beans:prop>
                <beans:prop key="hibernate.show_sql">true</beans:prop>
            </beans:props>
        </beans:property>
    </beans:bean>


<context:annotation-config />
 <!-- Enables the Spring MVC @Controller programming model -->
 <annotation-driven />

 <tx:annotation-driven transaction-manager="transactionManager"/>
    <beans:bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <beans:property name="sessionFactory" ref="sessionFactory" />
    </beans:bean>


   <!-- enable the configuration of transactional behavior based on annotations -->  
<!--   <tx:annotation-driven /> -->
   <!-- a PlatformTransactionManager is still required -->
 <!-- <beans:bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <beans:property name="dataSource" ref="dataSource"/>
  </beans:bean>-->



</beans:beans>

的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml,
                     /WEB-INF/spring/appServlet/spring-security.xml,
                     /WEB-INF/spring/appServlet/servlet-context.xml
         </param-value>
    </context-param>

    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
       <listener-class>
                org.springframework.web.context.request.RequestContextListener
       </listener-class>
    </listener>



     <filter>
        <filter-name>hibernateFilter</filter-name>
        <filter-class>
           org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
        </filter-class>
        <init-param>
            <param-name>sessionFactoryBeanName</param-name>
            <param-value>sessionFactory</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>hibernateFilter</filter-name>
        <url-pattern>*.htm</url-pattern>
    </filter-mapping>           





    <!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- Spring Security -->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

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

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

     <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/user/*</url-pattern>
    </servlet-mapping> 
    <welcome-file-list>

        <welcome-file>index.jsp</welcome-file>

    </welcome-file-list>

</web-app>

这是我的控制者:

LoginController.java

package com.project.controller;



import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;


import java.util.Date; 
import java.util.List;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;



import com.project.Utils.Encryption;
import com.project.service.LoginService;
import com.project.data.Prowadzacy;

@Controller
public class LoginController {

    @Autowired
    private LoginService loginService;


    @RequestMapping("loginform.html")
    public String ShowLogin(){
        return "login";
    }




    @RequestMapping("logout.html")
    public String Logout(HttpSession session){
    session.invalidate();
    return "login";

    }

    @RequestMapping("login.html")
    public String LoginAuthentication(HttpServletRequest req){
    String username=req.getParameter("user");
    String password=req.getParameter("pass");
    List<Prowadzacy> loginlist=loginService.validateLogin(username, password);

    return "login";

    }

    @RequestMapping("registrationform.html")
    public String registrationform() {
        return "registration";
    }

    @RequestMapping("registration")
    public String registration(HttpServletRequest req){
        String imiona=req.getParameter("imiona");
        String nazwisko=req.getParameter("nazwisko");
        String email=req.getParameter("Email");
        String username=req.getParameter("UserName");
        String password=req.getParameter("Password");

        Date date = new Date();

        Prowadzacy prow = new Prowadzacy();
        prow.setImiona(imiona);
        prow.setNazwisko(nazwisko);
        prow.setEmail(email);
        prow.setLogin(username);
        prow.setHaslo(password);
        prow.setWaznosc(true);
        prow.setDataDodania(date);
        prow.setAktywowany(false);      

        loginService.saveUser(prow);

        return "login";
    }
}

文件: LoginDaoImpl.java

package com.project.dao;


import com.project.data.Prowadzacy;

import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;


@Repository("loginDao")
public  class LoginDaoImpl implements LoginDao {


    @Autowired
    private SessionFactory sessionFactory;


    @Override
    @Transactional(readOnly=true)
    public List<Prowadzacy> validateLogin(String user, String password) {
        return this.sessionFactory.getCurrentSession().createQuery("from Prowadzacy where login=:user and haslo=:password").setString("password", password).list();


    }


    @Override
    @Transactional
    public void saveUser(Prowadzacy prow) {
    this.sessionFactory.getCurrentSession().save(prow);
    }

}

LoginDao.java

package com.project.dao;

import java.util.List;
import com.project.data.Prowadzacy;



public interface LoginDao {

    public List<Prowadzacy> validateLogin(String user, String password);

    public void saveUser(Prowadzacy user);

}

LoginServiceImpl.java

package com.project.service;

import java.util.List;


import com.project.dao.LoginDao;
import com.project.data.Prowadzacy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;



@Service("loginService")
public class LoginServiceImpl implements LoginService{

    @Autowired
    private LoginDao loginDao;

    @Override
    @Transactional
    public List<Prowadzacy> validateLogin(String user,String password){
        return loginDao.validateLogin(user, password);
    }

    @Override
    @Transactional
    public void saveUser(Prowadzacy user) {
        loginDao.saveUser(user);
    }

}

LoginService.java

package com.project.service;

import java.util.List;




import com.project.data.Prowadzacy;


public interface LoginService {
    public List<Prowadzacy> validateLogin(String user,String password);
    public void saveUser(Prowadzacy user);
}

1 个答案:

答案 0 :(得分:0)

您是否尝试将以下内容添加到Spring hibernateProperties中的applicationContext.xml定义中:

<beans:prop key="current_session_context_class">thread</beans:prop>

或者您是否尝试将@Transactional注释添加到基本/通用Hibernate DAO实现类?或者在服务层?