[
https://issues.apache.org/jira/browse/CXF-4290?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13280268#comment-13280268
]
Chris Dolan commented on CXF-4290:
----------------------------------
OK, yes, now I've properly verified that 2.5.4-SNAPSHOT solves the problem
using the provided ProxyClassLoader.
> 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