項目名:exam3
和資料庫互動時報錯:

嚴重: servlet.service() for servlet [spring2] in context with path [/exam3] threw exception [request processing failed; nested exception is org.hibernate.hibernateexception: no session found for current thread] with root cause
org.hibernate.hibernateexception: no session found for current thread
at org.springframework.orm.hibernate4.springsessioncontext.currentsession(springsessioncontext.java:97)
at org.hibernate.internal.sessionfactoryimpl.getcurrentsession(sessionfactoryimpl.java:988)
at com.dao.userdao.getbyidentity(userdao.java:26)
at com.dao.userdao.getbyidentityandstudentid(userdao.java:42)
at com.web.controller.logincontroller.login(logincontroller.java:56)
at sun.reflect.nativemethodaccessorimpl.invoke0(native method)
at sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:39)
at sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25)
at java.lang.reflect.method.invoke(method.java:597)
at org.springframework.web.method.support.invocablehandlermethod.invoke(invocablehandlermethod.java:219)
at org.springframework.web.method.support.invocablehandlermethod.invokeforrequest(invocablehandlermethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlermethod.invokeandhandle(servletinvocablehandlermethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.invokehandlemethod(requestmappinghandleradapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.handleinternal(requestmappinghandleradapter.java:686)
at org.springframework.web.servlet.mvc.method.abstracthandlermethodadapter.handle(abstracthandlermethodadapter.java:80)
at org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:925)
at org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:856)
at org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:936)
at org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:827)
at javax.servlet.http.httpservlet.service(httpservlet.java:621)
at org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:812)
at javax.servlet.http.httpservlet.service(httpservlet.java:728)
at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:305)
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:171)
at org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:99)
at org.apache.catalina.valves.accesslogvalve.invoke(accesslogvalve.java:953)
at org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:118)
at org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:408)
at org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1023)
at org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:589)
at org.apache.tomcat.util.net.jioendpoint$socketprocessor.run(jioendpoint.java:312)
at java.util.concurrent.threadpoolexecutor$worker.runtask(threadpoolexecutor.java:886)
at java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:908)
at java.lang.thread.run(thread.java:662)
頁面報錯如下:
終于找到原因了,是兩個配置檔案(beans.xml,spring2-servlet.xml)中context:component-scan配置得有問題.
項目目錄結構如下:
spring2-servlet.xml 中的部分代碼如下:

<context:component-scan base-package="com">
<context:include-filter type="annotation" expression="org.springframework.stereotype.controller"/>
</context:component-scan>
beans.xml中部分代碼如下:

<context:component-scan base-package="com" >
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.controller"/>
</context:component-scan>
值得注意的是:com目錄下既有dao,又有spring mvc的控制器。
解決方案
按如下方式修改之後就ok了:
spring2-servlet.xml:

<context:component-scan base-package="com.web">
<!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.controller"/> -->
beans.xml:

<context:component-scan base-package="com.dao" >
<!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.controller"/> -->
注意:
(1)spring內建hibernate的配置檔案是beans.xml;spring mvc的配置檔案是spring2-servlet.xml;
(2)以上兩個配置檔案中均有context:component-scan 标簽