You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Sergey Beryozkin (JIRA)" <ji...@apache.org> on 2013/07/09 15:13:49 UTC

[jira] [Resolved] (CXF-5104) JAX-RS not injecting contexts after resuming a suspended continuation

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

Sergey Beryozkin resolved CXF-5104.
-----------------------------------

       Resolution: Fixed
    Fix Version/s: 3.0.0
                   2.7.6
                   2.6.9
                   2.5.11
         Assignee: Sergey Beryozkin
    
> 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
>            Assignee: Sergey Beryozkin
>              Labels: async, continuation, jax-rs
>             Fix For: 2.5.11, 2.6.9, 2.7.6, 3.0.0
>
>         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