1

CXF JAXRSClientFactory を使用して、さまざまな JAX-RS インターフェースからプロキシ インスタンスを作成します。内部の奥深くで、このファクトリは Proxy.newProxyInstance() を呼び出し、私のインターフェイスと CXF クライアント インターフェイスを渡します。

OSGi では、インターフェイス クラスを含むバンドルが org.apache.cxf.jaxrs.client をインポートする場合、これはうまく機能します。しかし、ある日、CXF をアプリケーション クラスから隠したいと決心したので、クライアント ファクトリをサービスにカプセル化するバンドルを作成しました。Proxy から IllegalArgumentException が発生し、「MyInterface がクラス ローダーから見えない」または「クライアントがクラス ローダーから見えない」というメッセージが表示されます。

問題は、ファクトリ バンドルが CXF をインポートするが、アプリケーションをインポートしないことです。私のアプリケーション バンドルは CXF をインポートしません。そのため、CXF クライアント クラスと私の JAX-RS インターフェースの両方を参照できるコンテナー内のどこにもクラスローダーはありません。

CXF をアプリケーション バンドルにインポートせずにこれを解決する方法はありますか? たとえば、ファクトリ バンドルは、2 つのクラスローダーの結合である新しいクラスローダーを動的に作成できるので、CXF とアプリケーション クラスの両方を認識できますか? それとも、とにかく Proxy をだまして 2 つのインターフェイスを受け入れるようにさせることはできますか?

4

1 に答える 1

1

これは、CXF 2.6.1 の時点で解決可能な問題です。クローズ済みの問題CXF-4290は、カスタム クラスローダーを JAXRSClientFactory に渡すための新しい API を追加します。これと新しい 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 に答える