Uploaded image for project: 'Wicket'
  1. Wicket
  2. WICKET-5487

Request-scoped @SpringBean scoped-proxy throws IllegalStateException inside Atmosphere @Subscribe handler method

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Won't Fix
    • 6.13.0
    • None
    • wicket-atmosphere
    • None
    • Atmosphere 2.0.7, Tomcat 7.0

    Description

      Request-scoped @SpringBean's work well in plain {{WebPage}}s. Where the bean is powered by a scoped-proxy.

      However, something like this:

      import org.apache.wicket.atmosphere.Subscribe;
      
      	@SpringBean
      	private TenantRef tenant;
      
      	@Subscribe
      	public void updatePlaceProgress(AjaxRequestTarget target, PlaceProgressGenerated ev) {
      		if (ev.getTenantId().equals(tenant.getTenantId())) {
      			log.debug("[{}] updating placeProgressTable due to PlaceProgressGenerated {} with {} places",
      					tenant.getTenantId(), ev.getGenerationTime(), ev.getPlaceCompletions().size());
      			target.add(placeProgressTable);
      		}
      	}
      

      will throw:

      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.
      
      at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131) ~[spring-web-3.2.6.RELEASE.jar:3.2.6.RELEASE]
      
      at org.soluvas.commons.tenant.RequestOrCommandScope.currentRequestAttributes(RequestOrCommandScope.java:42) ~[classes/:na]
      
      at org.soluvas.commons.tenant.RequestOrCommandScope.get(RequestOrCommandScope.java:51) ~[classes/:na]
      
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:330) ~[spring-beans-3.2.6.RELEASE.jar:3.2.6.RELEASE]
      
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) ~[spring-beans-3.2.6.RELEASE.jar:3.2.6.RELEASE]
      
      at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:34) ~[spring-aop-3.2.6.RELEASE.jar:3.2.6.RELEASE]
      
      at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:184) ~[spring-aop-3.2.6.RELEASE.jar:3.2.6.RELEASE]
      
      at com.sun.proxy.$Proxy35.getTenantId(Unknown Source) ~[$Proxy35.class:na]
      
      at sun.reflect.GeneratedMethodAccessor87.invoke(Unknown Source) ~[na:na]
      
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_25]
      
      at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_25]
      
      at org.apache.wicket.proxy.LazyInitProxyFactory$JdkHandler.invoke(LazyInitProxyFactory.java:435) ~[wicket-ioc-6.13.0.jar:6.13.0]
      
      at com.sun.proxy.$Proxy162.getTenantId(Unknown Source) ~[$Proxy162.class:na]
      
      at com.quikdo.guardian.web.GuardianOverviewPage.updatePlaceProgress(GuardianOverviewPage.java:98) ~[classes/:na]
      
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)(NativeMethodAccessorImpl.java) ~[na:1.7.0_25]
      
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_25]
      
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_25]
      
      at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_25]
      
      at com.zeroturnaround.javarebel.uV.invoke(JRebel:1078) ~[na:201312230953]
      
      at java.lang.reflect.Method.invoke(Method.java) ~[na:1.7.0_25]
      
      at org.apache.wicket.atmosphere.SubscribeAnnotationEventSubscriptionInvoker.invoke(SubscribeAnnotationEventSubscriptionInvoker.java:43) ~[wicket-atmosphere-0.16.jar:0.16]
      
      at org.apache.wicket.atmosphere.AtmosphereRequestHandler.invokeMethod(AtmosphereRequestHandler.java:104) ~[wicket-atmosphere-0.16.jar:0.16]
      
      at org.apache.wicket.atmosphere.AtmosphereRequestHandler.executeHandlers(AtmosphereRequestHandler.java:81) ~[wicket-atmosphere-0.16.jar:0.16]
      
      at org.apache.wicket.atmosphere.AtmosphereRequestHandler.respond(AtmosphereRequestHandler.java:70) ~[wicket-atmosphere-0.16.jar:0.16]
      
      at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:861) ~[wicket-core-6.13.0.jar:6.13.0]
      
      at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64) ~[wicket-request-6.13.0.jar:6.13.0]
      
      at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:261) ~[wicket-core-6.13.0.jar:6.13.0]
      
      at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:218) ~[wicket-core-6.13.0.jar:6.13.0]
      
      at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:289) ~[wicket-core-6.13.0.jar:6.13.0]
      
      at org.apache.wicket.atmosphere.EventBus.post(EventBus.java:372) ~[wicket-atmosphere-0.16.jar:0.16]
      
      at org.apache.wicket.atmosphere.EventBus.postToSingleResource(EventBus.java:348) ~[wicket-atmosphere-0.16.jar:0.16]
      
      at org.apache.wicket.atmosphere.EventBus.post(EventBus.java:323) ~[wicket-atmosphere-0.16.jar:0.16]
      
      at org.soluvas.web.site.AtmosphereApplication.bridgeToAtmosphere(AtmosphereApplication.java:58) ~[classes/:na]
      
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)(NativeMethodAccessorImpl.java) ~[na:1.7.0_25]
      
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_25]
      
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_25]
      
      at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_25]
      
      at com.google.common.eventbus.EventHandler.handleEvent(EventHandler.java:74) ~[guava-15.0.jar:na]
      
      at com.google.common.eventbus.SynchronizedEventHandler.handleEvent(SynchronizedEventHandler.java:47) ~[guava-15.0.jar:na]
      
      at com.google.common.eventbus.EventBus.dispatch(EventBus.java:314) ~[guava-15.0.jar:na]
      
      at com.google.common.eventbus.AsyncEventBus.access$001(AsyncEventBus.java:34) ~[guava-15.0.jar:na]
      
      at com.google.common.eventbus.AsyncEventBus$1.run(AsyncEventBus.java:100) ~[guava-15.0.jar:na]
      
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_25]
      
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_25]
      
      at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
      

      It's understandable because the original web request had already been gone at the time the @Subscribe triggered.

      However, if this works as intended, what is the proper way to access beans "as it was during the original request"?

      Attachments

        Activity

          People

            papegaaij Emond Papegaaij
            ceefour Hendy Irawan
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: