Как объединить общие части WSDL и XSD из разных служб?

Я должен взаимодействовать с набором веб-сервисов, каждый из которых поставляется со своими WSDL и XSD. XSD иногда объединяются в один файл, иногда распространяются по нескольким файлам (20-30). Однако из опыта я знаю, что большая часть структуры сообщений и данных имеют большое общее подмножество, возможно, только 20% отличаются между различными транзакциями.

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

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

однако это приводит к тому, что требования к памяти адаптера проходят через крышу, поскольку каждая служба загружает свой контекст. Прямо сейчас у меня есть более 500 м памяти, используемой только для адаптера, в котором размещаются клиенты службы, еще до того, как я начну отправлять запросы и обрабатывать ответы. Хотя я могу запустить систему без проблем, используя текущую ситуацию, это создает ограничения, которые ставят под угрозу развертывание решения; мой клиент хотел бы уменьшите это драматически (60% или больше) так, что эту систему можно установить вдоль бортовых других без требования подъемов оборудования.

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

Я не привязан к CXF или JAXB, кроме времени, необходимого для повторного фактора системы к другой структуре или данным фурнитура.

заранее спасибо за вашу помощь.

--- редактировать ---

спасибо Блейз. Это указывает на функцию JAXB, которая была бы полезна : эпизоды. К сожалению, мне все еще нужно извлечь общую базовую часть разных служб. Итак, теперь мне нужно средство для извлечения этих общих частей через структурный diff, то есть инструмент diff, который будет знать структуру и иерархию типов, описанную XSD, чтобы поместить правильные ссылки место для соединения общих секций со специализированными деталями.

2 ответов


Если вы хотите немного сократить, альтернативная технология маршалинга (в любой структуре) может сделать трюк - drop JAXB и попробовать JiBX, который был добавлен в последнюю версию CXF, или, возможно, просто StAX.

поскольку вы хотите сделать что-то немного более пользовательское, чем обычные службы стиля JAX-Ws/JAXB, вы можете рассмотреть Spring-WS.

Spring-WS дает вам контроль над всеми аспектами стека веб-служб. Он может направлять сообщения по-разному способы (полезная нагрузка, выражения XPath и т. д.), И вы можете использовать любую технологию маршалинга/сериализации, которую хотите (Jibx, jDOM, SAX и т. д.)

Вот таблица, которая иллюстрирует варианты: http://static.springsource.org/spring-ws/sites/2.0/reference/html/server.html#d4e1062

Если вы действительно хотите получить фантазии, вы можете взять один из API нижнего уровня, начать маршалинг сообщения и как только вы нажмете критическую массу для одной из ваших общих областей, запустите JAXB marshall прямо на месте.

возможность маршрутизации сообщений на разные " конечные точки "(в терминах Spring-WS) означает, что вы также можете делать такие вещи, как" принять любое сообщение " на этом одном интерфейсе (который выглядит как DOM/SAX/etc), а затем иметь одну большую операцию маршалинга.

ключевая вещь Spring-WS купит вас здесь, чтобы вырваться из формы JAX-WS, играть немного переднюю игру, а затем вы всегда можете Маршалл вернуться к JAXB позже, будь то в перехватчиках, ваше приложение и т. д. В theor вы можете то же самое с источником JAXB DOM, но я считаю, что стек Spring-WS дает вам самый точный контроль для особых ситуаций, как у вас здесь.


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