[
https://issues.apache.org/jira/browse/WICKET-5487?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13888893#comment-13888893
]
Martin Grigorov commented on WICKET-5487:
-----------------------------------------
http://wicket.apache.org/guide/guide/nativewebsockets.html#nativewebsockets_6
Wicket integration with Spring just provides a way to get Spring beans that can
be serialized with the page, i.e. wraps the bean in a serializable proxy.
Nothing more.
Since WebSocket communication is not intercepted by Servlet Filters Spring has
no chance to inject the special session/request attributes it needs to be able
to properly resolve scoped beans.
Since 4.x Spring provides support for WebSockets. Maybe they provide APIs that
libraries like Atmosphere can use to make this possible.
As I can see you use Spring 3.2.6.
> 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.1.5#6160)