You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Emond Papegaaij (JIRA)" <ji...@apache.org> on 2014/05/14 20:45:16 UTC

[jira] [Closed] (WICKET-5487) Request-scoped @SpringBean scoped-proxy throws IllegalStateException inside Atmosphere @Subscribe handler method

     [ https://issues.apache.org/jira/browse/WICKET-5487?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Emond Papegaaij closed WICKET-5487.
-----------------------------------

    Resolution: Won't Fix

As stated by Martin, this is not an issue caused by Wicket, but by spring not supporting WS-connections. You might take a look at CDI/Weld, they might support @RequestScoped beans in a WS-connections, although this seems to suggest otherwise: https://issues.jboss.org/browse/CDI-370

> Request-scoped @SpringBean scoped-proxy throws IllegalStateException inside Atmosphere @Subscribe handler method
> ----------------------------------------------------------------------------------------------------------------
>
>                 Key: WICKET-5487
>                 URL: https://issues.apache.org/jira/browse/WICKET-5487
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket-atmosphere
>    Affects Versions: 6.13.0
>         Environment: Atmosphere 2.0.7, Tomcat 7.0
>            Reporter: Hendy Irawan
>            Assignee: Emond Papegaaij
>
> Request-scoped {{@SpringBean}}'s work well in plain {{WebPage}}s. Where the bean is powered by a scoped-proxy.
> However, something like this:
> {code}
> 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);
> 		}
> 	}
> {code}
> will throw:
> {code}
> 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]
> {code}
> 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"?



--
This message was sent by Atlassian JIRA
(v6.2#6252)