Как использовать одновременно разные версии одних и тех же классов - PullRequest
0 голосов
/ 12 августа 2010

Я должен предоставить интерфейс для набора веб-сервисов, для которых я сгенерировал заглушки кода и привязку объекта.Многие из транзакций имеют общую объектную модель и, таким образом, большая часть сгенерированного кода перекрывается.Обычно это не представляет проблемы, так как я бы просто использовал один и тот же код, поскольку wsdl связывал бы те же файлы xsd.

К сожалению, здесь поставщик этих служб разделил xsd, так что каждый из них связывается сотдельный набор (в основном копия) тех же файлов.В своей спецификации они утверждают, что реализация на стороне клиента должна изолировать каждый веб-сервис для облегчения обслуживания.По сути, они хотят иметь возможность изменять xsd для одного веб-сервиса, оставляя все остальные нетронутыми.

Вопрос заключается в следующем:

Как я могу интегрировать эти различные наборы сгенерированных классов водна и та же программа, чтобы каждый сервис предоставлял свои функциональные возможности, не мешая своим братьям?

Одним из решений, которое я думал, было создание фасада для каждого из них, который предоставил бы желаемую функциональность и объектную модель, чтобы фактическая реализация осталасьскрытый.Тогда, несмотря на умное использование пользовательских загрузчиков классов, каждый фасад будет загружать конкретный jar, содержащий сгенерированный код для этой конкретной службы.

Есть мысли?идеи?с каким опытом вы столкнулись с подобной проблемой?

спасибо

Ответы [ 3 ]

2 голосов
/ 12 августа 2010

Рассматривали ли вы использование пакетов на основе OSGi (например, Eclipse Equinox runtime)?Используя реализацию на основе OSGi, каждый набор сгенерированных классов будет находиться в отдельном пакете (файл .jar), который получает собственный загрузчик классов и может выборочно экспортировать части своего API в остальную часть приложения.Таким образом, он обеспечивает готовую реализацию предложенного вами решения.

1 голос
/ 12 августа 2010

В общем, самый простой способ справиться с этим - использовать файл привязки jaxb (или параметр -p для инструмента wsdl2java в CXF), чтобы отобразить сгенерированный код в пакет, специфичный для конкретной службы. Таким образом, у каждого сервиса будут свои объекты для работы.

Сложность возникнет, если вам придется интегрировать различные услуги. Как принять возврат от одного, чтобы позвонить в другого. Поскольку объекты будут совершенно разными, вам нужно будет написать код для копирования данных из одного в другой. Возможно, не весело. : - (

0 голосов
/ 12 августа 2010

Для Java два класса отличаются друг от друга, когда они загружаются отдельными загрузчиками классов. Вы можете воспользоваться этим, загрузив 2 версии классов самостоятельно из 2 URLClassLoaders, которые получают URL-адрес соответствующих jar-файлов как classpath. Вам может не понадобиться строить 2 фасада, если оба набора объектов реализуют одинаковые интерфейсы.

обновление

Да, банки не должны находиться в пути к классу основного приложения. Если вы установите загрузчик классов основного приложения в качестве родительского для ваших URLClassLoaders, загруженные классы по-прежнему будут иметь доступ к остальной части пути к классам, которую использует ваше приложение.

Для static s, если они являются константами, они, вероятно, будут встроены компилятором. Для статических переменных вы получите 2, 1 за каждую загруженную банку. Если эти переменные используются вне контекста jar-файлов, вам, вероятно, придется обращаться к ним через отражение от их объектов класса. Если вам нужно выбрать одну поверх другой или объединить их, это зависит от приложения, я думаю, что если вы сможете загружать и использовать 2 версии в 1 приложении, любые статические переменные будут использоваться только в контексте соответствующих jar-файлов.

...