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 2012/05/21 23:47:41 UTC
[jira] [Resolved] (CXF-4290) Allow user-specified classloader for
JAXRSClientFactory
[ https://issues.apache.org/jira/browse/CXF-4290?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sergey Beryozkin resolved CXF-4290.
-----------------------------------
Resolution: Fixed
Fix Version/s: 2.5.4
2.6.1
Assignee: Sergey Beryozkin
> 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
> Assignee: Sergey Beryozkin
> Fix For: 2.6.1, 2.5.4
>
>
> 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