Опасения по поводу управления артефактами JAX WS

Я разрабатываю приложение, которое интенсивно использует веб-сервисы. Я буду разрабатывать как клиентскую, так и серверную стороны этого приложения. Я хотел бы использовать JAX WS (который я новичок), потому что это, кажется, будущее для веб-сервисов для Java, но у меня есть ряд проблем, связанных с артефактами. Ни одна из этих проблем не является нарушением условий сделки, но в целом JAX WS создает много неудобств. Я новичок в JAX WS, так что, возможно, есть вещи, о которых я не знаю, которые могли бы облегчить мои опасения.

Вот мои проблемы:

  1. Я предполагаю наличие довольно большого количества POJO, которые передаются между клиентом и сервером (из-за отсутствия лучшего термина я буду называть эти транспортные объекты). Я хотел бы включить в эти объекты документацию и бизнес-логику (для начала, equals, hashcode, toString). Если у меня есть бизнес-логика в этих классах, я не могу использовать wsimport для создания аннотаций для них, и мне приходится управлять ими вручную. Кажется громоздким и подверженным ошибкам.

  2. Я могу выбрать, чтобы система сборки создавала артефакты или разработчики создавали артефакты и включали их в систему контроля версий. Если артефакты создаются системой сборки, то всякий раз, когда член команды обновляет API, каждый должен создавать артефакты в своих собственных средах разработки. Если артефакты создаются разработчиками и проверяются в системе контроля версий, каждый раз, когда член команды переименовывает или удаляет API, он должен не забыть удалить артефакты-оболочки. Любой подход кажется обременительным. Какова лучшая практика здесь?

  3. wsimport создает все артефакты в одном пакете. Я буду создавать несколько сервисов, и у меня будет несколько транспортных объектов, которые являются общими, и поэтому мне нужно wsimport все мои сервисы в одном пакете. Если у двух сервисов есть API с одинаковым именем, артефакты обертки будут конфликтовать.

  4. Я ожидаю, что в моих сервисах будет как минимум сто API. Это означает как минимум 200 классов-обёрток. Похоже, огромное количество беспорядка. Много-много классов, которые не представляют интереса для развития. Что еще хуже, эти классы-обертки будут находиться в том же пакете, что и транспортные объекты, которые будут одними из наиболее часто используемых классов в моей системе. Отношение сигнал / шум очень низкое для самого важного пакета в моей системе.

Будем очень благодарны за любые подсказки, которые кто-либо может дать мне, чтобы облегчить разработку моего приложения.

1 ответ

Решение

Если у вас есть контроль над клиентом и сервером, вам не нужно создавать клиент с wsimport, В настоящее время я делаю это следующим образом: один проект определяет API для веб-службы. API состоит из интерфейса и всех классов "объектов переноса". Еще один проект реализует сервис. Теперь вы можете передать API клиенту, который теперь может использовать сервис и может использовать все ваши дополнительные бизнес-методы.

Если предположить, ServiceInterface Ваш сервисный интерфейс, клиент может выглядеть так:

Service s = Service.create(
        new URL("http://example.com/your_service?wsdl"),
        new QName("http://example.com/your_namespace", "YourServiceName"));
ServiceInterface yourService = s.getPort(
        new QName("http://example.com/your_namespace", "YourPortName"),
        ServiceInterface.class);

И просто так у вас есть сервисный клиент. Таким образом, вы можете использовать все свои методы (1), у вас есть полный контроль над вашими пакетами (3), и у вас нет никаких классов-оболочек, поскольку все они генерируются во время выполнения (4). Я думаю, что (2) решается и этим.

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

Другие вопросы по тегам