title: Getting a 'No thread-bound request found' error from spring in my web app
body: <p>I'm getting a 'No thread-bound request found' error in my web app and hoping to get some help.
  I'm trying to use struts2 + spring + hibernate, and use spring to manage the hibernate session factory, and inject hibernate sessions into my struts actions. I hope that made sense.
  When the app starts up, there are no errors, but when i make the first web request it bombs out with the 'No thread-bound request found' error.
  Here's my spring config:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"&gt;
  &lt;beans&gt;
    &lt;bean id="hibernateSessionFactory" scope="singleton"
      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;
      &lt;property name="configLocation" value="classpath:hibernate.cfg.xml" /&gt;
    &lt;/bean&gt;
    &lt;bean id="hibernateSession" factory-bean="hibernateSessionFactory"
      factory-method="openSession" destroy-method="close" scope="request" class="org.hibernate.Session" /&gt;
  &lt;/beans&gt;
  </code></pre>
  
  <p>Here's my action:</p>
  
  <pre><code>package actions.events;
  import org.hibernate.Session;
  
  public class Listing {
    Session session;
    public void setHibernateSession(Session value) throws Exception
    {
      session = value;
    }
  
    public String execute() {
      return "success";
    }
  }
  </code></pre>
  
  <p>My only lead is that if i remove the 'setHibernateSession' function above, i don't get the error because presumably spring doesn't bother creating a session if the action doesn't need one (lazy instantiation).</p>
  
  <p>And here's the exception:</p>
  
  <pre><code>Unable to instantiate Action, actions.events.Listing, defined for 'Listing' in namespace '/events'Error creating bean with name 'hibernateSession': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
  com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:307)
  com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:388)
  com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:187)
  org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
  org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
  com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
  org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:478)
  org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
  org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
  org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
  com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
  org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
  org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
  org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
  org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
  org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
  org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
  org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
  org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
  org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
  org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
  java.lang.Thread.run(Unknown Source)
  </code></pre>
  
  <p>Oh and the kicker is that my web.xml <em>does</em> have the necessary context listener, so the http request should be recognised by struts:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;web-app ...
    ...
    &lt;listener&gt;
      &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
    &lt;/listener&gt;
    ...
  &lt;/web-app&gt;
  </code></pre>