CXF JAXRSClientFactoryを使用して、さまざまなJAX-RSインターフェイスからプロキシインスタンスを作成します。深い内部では、このファクトリはProxy.newProxyInstance()を呼び出し、自分のインタフェースとCXFクライアントインタフェースを渡します。2つの別々のクラスローダーからjava.lang.reflect.Proxyを作成するにはどうすればよいですか?
OSGiの下では、私のインターフェイスクラスを含むバンドルがorg.apache.cxf.jaxrs.clientをインポートする場合、これはうまく動作します。しかし、ある日、私はアプリケーションクラスからCXFを隠そうと決めたので、クライアントファクトリをサービスにカプセル化したバンドルを作成しました。今、私は、 "MyInterfaceがクラスローダーから見えない"、または "クライアントがクラスローダーから見えない"というプロキシからIllegalArgumentExceptionを取得します。
私の工場バンドルはCXFをインポートしていますが、私のアプリケーションはインポートしていないという問題があります。私のアプリケーションバンドルはCXFをインポートしません。したがって、CXF ClientクラスとJAX-RSインターフェイスの両方を見ることができるコンテナ内には、クラスローダーはありません。
アプリケーションバンドルにCXFをインポートせずにこれを解決する方法はありますか?たとえば、私のファクトリバンドルは、2つのクラスローダの和集合である新しいクラスローダを動的に作成できるので、CXFとアプリケーションクラスの両方を見ることができますか?とにかく、2つのインターフェースを受け入れるようにProxyを欺くことはできますか?
このブログは私の問題に非常に密接に関連しているようだが、私はかなりCXFの文脈ではまだピーターのソリューションをgrokkedしていない:http://blog.osgi.org/2008/08 /classy-solutions-to-tricky-proxies.html –
私はPeterのソリューション(両方のクラスを見ることができる、集約クラスローダーをオンザフライで作成する)で切り詰めました。 JAX-RSのサブリソースを除いて、うまくいったようです。 CXFは、ClientProxyImpl.invoke()のサブリソースがアクセスされるにつれて、その場で追加のプロキシを作成します.CXFコードでそれを傍受する方法はありません。 –