[ https://issues.apache.org/jira/browse/CXF-5104?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13700662#comment-13700662 ]
Sergey Beryozkin commented on CXF-5104: --------------------------------------- thanks for a patch, I'll need to refresh my memory why I did it coded this way. FYI, you can always use PhaseInterceptorChain.getCurrentMessage(). Also consider using JAX-RS 2.0 AsyncResponse > JAX-RS not injecting contexts after resuming a suspended continuation > --------------------------------------------------------------------- > > Key: CXF-5104 > URL: https://issues.apache.org/jira/browse/CXF-5104 > Project: CXF > Issue Type: Bug > Components: JAX-RS > Environment: CXF 2.7.5, MAC-OSX 10.7.5, Tomcat 7.0.41, Spring 3.0.7 > Reporter: Sharath P > Labels: async, continuation, jax-rs > Attachments: AsyncResource.java, beans.xml, CXF-5104.patch, > JsonBean.java, web.xml > > > Problem: > In order to use continuations, I have a 'MessageContext' injected into the > JAX-RS resource using @Context annotation. When the request is initially > handled, JAX-RS properly sets the thread-local MessageContext > (ThreadLocalMessageContext) for that particular instance of thread, and am > able to retrieve the ContinuationProvider (in my case > org.apache.cxf.transport.http.Servlet3ContinuationProvider) from context. > Once I suspend the continuation and resume the same later, however, the > thread-local MessageContext instance is not being set and therefore am unable > to retrieve the resumed continuation (as ThreadLocalMessageContext is null > through which continuation provider has to be retrieved). > Possible Fix: > Looks like the cause of the problem is in > org.apache.cxf.jaxrs.JAXRSInvoker.invoke(Exchange, Object, Object) > implementation, when a continuation is resumed, wasSuspended would be true > and there is a conditional block which injects params and contexts only when > wasSuspended = false. Extracting the injection of the params and contexts > out of this conditional block would fix the issue as so: > ****** > boolean wasSuspended = exchange.remove(REQUEST_WAS_SUSPENDED) != null; > > if (!wasSuspended) { > pushOntoStack(ori, ClassHelper.getRealClass(resourceObject), inMessage); > > } > final boolean contextsAvailable = cri.contextsAvailable(); > final boolean paramsAvailable = cri.paramsAvailable(); > if (contextsAvailable || paramsAvailable) { > Object realResourceObject = ClassHelper.getRealObject(resourceObject); > if (paramsAvailable) { > JAXRSUtils.injectParameters(ori, realResourceObject, inMessage); > } > if (contextsAvailable) { > InjectionUtils.injectContexts(realResourceObject, cri, inMessage); > } > } > if (cri.isRoot()) { > ProviderInfo<?> appProvider = > > (ProviderInfo<?>)exchange.getEndpoint().get(Application.class.getName()); > if (appProvider != null) { > InjectionUtils.injectContexts(appProvider.getProvider(), > appProvider, > inMessage); > } > } > ****** -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira