Публикация нескольких портов с помощью одной службы с использованием JAX-WS 2.0 и @WebService

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

Пример:

interface A:
    ObjectA get(String name);

interface B:
    ObjectB get(String name);

Service:
    port A
          get
    port B
          get

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

Я бы хотел разоблачить оба порта, используя одну и ту же службу, чтобы было ясно, что они оба являются частью одного и того же API. Возможно ли это?

В действительности, то, что мне нужно, имеет некоторую поддержку вложенного пространства имен в WSDL, поэтому я могу использовать те же методы в разных пространствах имен. У меня будут методы get/set/delete для разных видов данных рядом друг с другом, но я бы предпочел не размещать их в одном большом интерфейсе с getA/getB и т.д., Так как я хотел бы иметь возможность для добавления новых типов данных позже без принудительного восстановления всех клиентов из нового набора WSDL. Любые советы по достижению этого приветствуются, даже если это означает использование другого способа генерации WSDL из java-кода.

Ответ 1

Вы можете попробовать переименовать один из методов и явно указать поля action или operationName в аннотации @WebMethod.

Ответ 2

Я бы предложил вместо определения входного параметра как String, вам следует рассмотреть возможность определения RequestType (complextype in xsd) для каждого из этих методов, и это даст вам следующие преимущества:
1. Если у вас определенный сложный тип, тогда запрос может развиваться независимо, где вы добавляете больше элементов в сложный тип, в то время как подпись веб-метода не изменяется в wsdl.
2. У вас может быть одно и то же имя для двух методов, таких как u выше (например, get (...)), в то время как у обоих из них будут разные типы запросов. Вы можете достичь этого либо путем определения двух разных элементов в xsd (с тем же пространством имен) с разными именами запросов. Если вы хотите иметь одно и то же имя для элементов запроса, вы должны рассмотреть их определение в разных пространствах имен. Таким образом, в ООП они будут генерироваться в разных пакетах, и поэтому они могут иметь одно и то же имя.

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

Ответ 3

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

интерфейс

public interface OB {
public Object get(String name);
}

Вебсервис

@Override
@WebMethod
public Object get(String name) {
    if(name.equals("A")){
        return new ObjectA("A");
    }else if(name.equals("B")){
        return new ObjectB(1);
    }else {
        return null;
    }
}

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