Проблема Пространства Имен/Пути К Классам Axis2

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

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

например

веб-служба 1 namespace1 - > com.компания.вебсервис.клиент1.сервис

namespace1 веб-службы 2 - > com.компания.вебсервис.клиент2.сервис

где namespace1 ссылается к тому же URL пространства имен.

С помощью параметра namespace2package wsdl2java на платформе это:

// Web Service Client 1's namespace parameter
--namespace2package http://www.multispeak.org/Version_3.0=com.company.webservice.client1.service

// Web Service Client 2's namespace parameter
--namespace2package http://www.multispeak.org/Version_3.0=com.company.webservice.client2.service

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

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

java.ленг.ClassCastException: com.компания.вебсервис.клиент1.услуга.impl.GetAllMetersResponseDocumentImpl не может быть приведен к com.компания.вебсервис.клиент2.услуга.GetAllMetersResponseDocument

Я запутал некоторые из фактических значений выше.

Итак, проблема, похоже, заключается в том, как Axis2/XMLBeans ищет соответствующий класс, соответствующий заданному XML для анализа.

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

есть ли способ сделать это так, что я можно ли сохранить разные пространства имен для каждого jar клиента веб-службы?

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

надеюсь, проблема имеет смысл, но если мне нужно предоставить что - нибудь еще, что поможет, пожалуйста, дайте мне знать, и я расширю этот вопрос с более подробной информацией, но, надеюсь, кто-то со знанием Axis2/XMLBeans / Web service client generation с помощью Wsdl2Java должен быть в состоянии ответить на это без дополнительной информации.

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

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

обновление 2: Этот подход одинаково не работает, поскольку две веб-службы, несмотря на использование одного и того же пространства имен, создают разные версии моделей пространства имен, которые теперь вызывают ошибки времени компиляции в зависимости от порядка пути к классам. Так... Вернемся к началу...

1 ответов


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

Это причина, почему он работает, когда у вас есть один из банок загружен.

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

UDATE Я фактически только что проверил, имеет ли axis2 изоляцию classloader, определенную по умолчанию, и это так. https://axis.apache.org/axis2/java/core/faq.html читать Загрузки Класса Вопросы

Я считаю также чтение изоляция обслуживания и модуля из этой статьи поможет вы. https://www.developer.com/open/article.php/10930_3589126_2/Avoiding-Mistakes-Made-Using-Axis2.htm