web-dev-qa-db-fra.com

Obtenir une erreur «Aucune demande liée au thread trouvée» à partir du printemps dans mon application Web

Je reçois une erreur "Aucune demande liée au thread trouvée" dans mon application Web et j'espère obtenir de l'aide. J'essaie d'utiliser struts2 + spring + hibernate, et d'utiliser spring pour gérer la fabrique de sessions hibernate, et d'injecter des sessions hibernate dans mes actions struts. J'espère que cela avait du sens. Lorsque l'application démarre, il n'y a aucune erreur, mais lorsque je fais la première demande Web, elle se déclenche avec l'erreur "Aucune demande liée au fil trouvée". Voici ma configuration de printemps:

<?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>

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

Mon seul avantage est que si je supprime la fonction 'setHibernateSession' ci-dessus, je n'obtiens pas l'erreur car le printemps ne dérange probablement pas la création d'une session si l'action n'en a pas besoin (instanciation paresseuse).

Et voici l'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 et le kicker est que mon web.xml fait a l'écouteur de contexte nécessaire, donc la requête http doit être reconnue par struts:

<?xml version="1.0" encoding="UTF-8"?>
<web-app ...
  ...
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  ...
</web-app>
25
Chris

Pour utiliser la portée de la demande sans Spring MVC, vous devez déclarer RequestContextListener dans web.xml (voir .5.4.1. Configuration Web initiale ):

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

Si vous configurez votre application en utilisant Java au lieu de XML, la même configuration peut être appliquée dans

 public void onStartup(ServletContext servletContext) throws ServletException {
          //add listener
          servletContext.addListener(new RequestContextListener());
5
felipe