Chris Dolan created CXF-4290:
--------------------------------

             Summary: Allow user-specified classloader for JAXRSClientFactory
                 Key: CXF-4290
                 URL: https://issues.apache.org/jira/browse/CXF-4290
             Project: CXF
          Issue Type: Improvement
          Components: JAX-RS
    Affects Versions: 2.5
         Environment: Apache Karaf 2.2.4, CXF 2.5.0
            Reporter: Chris Dolan


I wrote a helper class that isolates CXF's JAXRSClientFactory from users. My 
helper exposes this interface as a OSGi service:

{code}
public interface JaxRsClientBuilder {
    <T> T createClient(@Nonnull String baseUrl, @Nonnull Class<T> 
resourceApiClass);
}
{code}

However, I discovered a blocking problem. If the user of my helper doesn't 
import org.apache.cxf.jaxrs.client in its OSGi classloader, then I get 
exceptions from java.lang.reflect.Proxy because there's no classloader anywhere 
that can see both resourceApiClass and org.apache.cxf.jaxrs.client.Client. I 
tried a solution (based on 
http://blog.osgi.org/2008/08/classy-solutions-to-tricky-proxies.html) where I 
dynamically make an aggregate classloader that can see both resourceApiClass 
and Client. I think I can trick JAXRSClientFactory into using this new 
classloader for the main resource (by passing in a new Proxy instance as the 
resource class), but I can't wedge my custom classloader in for subresources 
because of the way ClientProxyImpl.invoke() calls JAXRSClientFactory.

I request the following as a possible solution. Certainly, I'd accept a better 
solution. For example, it looks like JAX-RS 2.0 should eliminate this problem 
by making Client into a public interface instead of an implementation detail.
 1) add a new method variant to JAXRSClientFactory that takes a classloader
 2) pass this classloader to JAXRSClientFactoryBean, and use it instead of 
cri.getServiceClass().getClassLoader() or the thread context classloader
 3) change ClientProxyImpl to save this classloader and use it for subresources


See also the following which describes my failed attempt to work around this 
issue: 
http://stackoverflow.com/questions/10458378/how-can-i-make-a-java-lang-reflect-proxy-from-two-separate-classloaders

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to