Публикация нескольких портов с одним сервисом с использованием JAX-WS 2.0 и @WebService - PullRequest
12 голосов
/ 03 сентября 2010

Я хочу создать службу 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.

Ответы [ 3 ]

1 голос
/ 18 декабря 2013

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

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

1 голос
/ 29 декабря 2010

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

0 голосов
/ 02 мая 2014

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

interface

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

Webservice

@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;
    }
}

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

...