[ https://issues.apache.org/jira/browse/CXF-4290?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13278914#comment-13278914 ]
Chris Dolan commented on CXF-4290: ---------------------------------- I think it worked. I need to do a more detailed test, but for right now, I just renamed it to cxf-bundle-2.5.0.jar and dropped it into my Maven repo, and commented out my temporary "Import-Package: org.apache.cxf.jaxrs.client" and everything works. Nothing breaks, anyway, so I say ship it! :-) Thanks so much, Sergey. > 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