1

我使用 CXF JAXRSClientFactory 从各种 JAX-RS 接口创建代理实例。在内部,这个工厂调用 Proxy.newProxyInstance(),传入我的接口和 CXF 客户端接口。

在 OSGi 下,如果包含我的接口类的包导入 org.apache.cxf.jaxrs.client,这将非常有用。但是有一天我决定要从我的应用程序类中隐藏 CXF,所以我创建了一个包,将客户端工厂封装在一个服务中。现在我从 Proxy 得到 IllegalArgumentException 说“MyInterface 在类加载器中不可见”或“客户端在类加载器中不可见”。

问题是我的工厂包导入 CXF 但不是我的应用程序。而且我的应用程序包不导入 CXF。因此,容器中的任何地方都没有可以看到 CXF 客户端类和我的 JAX-RS 接口的类加载器。

有没有办法在不将 CXF 导入我的应用程序包的情况下解决这个问题?例如,我的工厂包是否可以动态创建一个新的类加载器,它是两个类加载器的联合,所以它可以看到 CXF 和我的应用程序类?或者我可以欺骗代理接受这两个接口吗?

4

1 回答 1

1

从 CXF 2.6.1 开始,这现在是一个可解决的问题。已关闭的问题CXF-4290添加了一个新 API 以将自定义类加载器传递给 JAXRSClientFactory。有了它和新的 org.apache.cxf.jaxrs.client.ProxyClassLoader 类,我现在可以为任意应用程序类制作代理。

    ProxyClassLoader classLoader = new ProxyClassLoader();
    classLoader.addLoader(resourceApiClass.getClassLoader());
    classLoader.addLoader(JAXRSClientFactoryBean.class.getClassLoader());

    JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
    bean.setAddress(baseUrl);
    bean.setServiceClass(resourceApiClass);
    bean.setClassLoader(classLoader);
    return bean.create(resourceApiClass);
于 2012-09-19T20:56:45.160 回答