2012-05-05 3 views
1

Я использую CXF JAXRSClientFactory для создания экземпляров прокси из различных интерфейсов JAX-RS. Глубоко внутри этот завод вызывает Proxy.newProxyInstance(), передавая мой интерфейс и клиентский интерфейс CXF.Как я могу создать java.lang.reflect.Proxy из двух отдельных загрузчиков классов?

В OSGi это отлично работает, если пакет, содержащий мой класс интерфейса, импортирует org.apache.cxf.jaxrs.client. Но однажды я решил, что хочу скрыть CXF из своих классов приложений, поэтому я создал пакет, который инкапсулирует клиентскую фабрику в службу. Теперь я получаю IllegalArgumentException из прокси, говоря: «MyInterface не видно из загрузчика классов» или «Клиент не виден из загрузчика классов».

Проблема в том, что мой заводский комплект импортирует CXF, но не мое приложение. И мой пакет приложений не импортирует CXF. Таким образом, в контейнере нет класса loadloader, который может видеть как клиентский класс CXF, так и мой интерфейс JAX-RS.

Есть ли способ решить эту проблему без импорта CXF в мои пакеты приложений? Например, может ли мой заводский пакет динамически создать новый загрузчик классов, который является объединением двух загрузчиков классов, поэтому он может видеть как CXF, так и мои классы приложений? Или я могу обмануть Proxy в том, чтобы принять оба интерфейса?

+0

Этот блог Питер Кринс в 2008 году, кажется, очень тесно связан с моей проблемой, но я не совсем grokked решения Петра еще в контексте CXF: http://blog.osgi.org/2008/08 /classy-solutions-to-tricky-proxies.html –

+0

Я взял разрез в решении Питера (создавая агрегатный загрузчик классов «на лету», который может видеть оба класса). Похоже, что это сработало бы, за исключением суб-ресурсов JAX-RS. CXF делает дополнительные прокси-серверы «на лету» в ClientProxyImpl.invoke(), поскольку к этим вспомогательным ресурсам обращаются, и я не вижу никакого способа перехватить это в коде CXF. –

ответ

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); 
Смежные вопросы