2012-05-05 18 views
1

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を欺くことはできますか?

+0

このブログは私の問題に非常に密接に関連しているようだが、私はかなりCXFの文脈ではまだピーターのソリューションをgrokkedしていない:http://blog.osgi.org/2008/08 /classy-solutions-to-tricky-proxies.html –

+0

私はPeterのソリューション(両方のクラスを見ることができる、集約クラスローダーをオンザフライで作成する)で切り詰めました。 JAX-RSのサブリソースを除いて、うまくいったようです。 CXFは、ClientProxyImpl.invoke()のサブリソースがアクセスされるにつれて、その場で追加のプロキシを作成します.CXFコードでそれを傍受する方法はありません。 –

答えて

1

これは、CXF 2.6.1以降の問題を解決しました。閉鎖された問題CXF-4290は、JAXRSClientFactoryにカスタムクラスローダーを渡すための新しいAPIを追加します。これと新しいorg.apache.cxf.jaxrs.client.ProxyClassLoaderクラスを使用して、任意のアプリケーションクラスのプロキシを作成できるようになりました。 2008年にピーター・Kriens氏による

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); 
関連する問題