Getting a 'No thread-bound request found' error from spring in my web app

48,367

Solution 1

To use request scope without Spring MVC, you should declare RequestContextListener in web.xml (see 3.5.4.1. Initial web configuration):

<web-app>
  ...
  <listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
  </listener>
  ...
</web-app>

Solution 2

If you are configuring your app using Java instead of XML the same conf can be applied in

 public void onStartup(ServletContext servletContext) throws ServletException {
          //add listener
          servletContext.addListener(new RequestContextListener());
Share:
48,367
Chris
Author by

Chris

iOS developer / contractor based in Sydney.

Updated on January 19, 2020

Comments

  • Chris
    Chris over 4 years

    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:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
    <beans>
      <bean id="hibernateSessionFactory" scope="singleton"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />
      </bean>
      <bean id="hibernateSession" factory-bean="hibernateSessionFactory"
        factory-method="openSession" destroy-method="close" scope="request" class="org.hibernate.Session" />
    </beans>
    

    Here's my action:

    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";
      }
    }
    

    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).

    And here's the exception:

    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)
    

    Oh and the kicker is that my web.xml does have the necessary context listener, so the http request should be recognised by struts:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app ...
      ...
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      ...
    </web-app>
    
  • Chris
    Chris over 14 years
    Sorry, when i try that i get the following error: 437 [main] FATAL org.apache.struts2.spring.StrutsSpringObjectFactory - ********** FATAL ERROR STARTING UP STRUTS-SPRING INTEGRATION ********** Looks like the Spring listener was not configured for your web app! Nothing will work until WebApplicationContextUtils returns a valid ApplicationContext. You might need to add the following to web.xml: <listener> <listener-class>org.springframework.web.context.ContextLoade‌​rListener</listener-‌​class> </listener> 453 [main] ERROR org.apache.struts2.dispatcher.Dispatcher - Dispatcher i
  • Chris
    Chris over 14 years
    Hang on, if i include both listeners, it works! The RequestContextListener and the ContextLoaderListener together works. Is it bad that i'm using both?
  • axtavt
    axtavt over 14 years
    They serve different purposes - ContextLoaderListener load Spring application context, then RequestContextListener provides support for request-scoped beans
  • Chris
    Chris over 14 years
    Thanks so much! You're much more helpful than the official spring forums. That explains it perfectly, ok great.
  • xbmono
    xbmono over 4 years
    I see this as the solution to fix this error everywhere in the internet but for me it doesn't work. I have both RequestContextFilter and RequestContextListener but no luck. What have I missed?