Веб-сервисы: голые и завернутые? - PullRequest
18 голосов
/ 16 марта 2011

Я генерирую некоторые веб-сервисы из некоторых существующих wsdl

Я использую Maven для этого, но некоторые веб-сервисы создаются с

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)  

, а другие с

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 

Jaxb или xjc делает это автоматически?потому что у меня нет никаких различий в WSDLS ...

Ответы [ 4 ]

27 голосов
/ 25 мая 2011

Веб-сервисы BARE генерируются, когда имя операции, имя сообщения и имя элемента отличаются по форме или форме.Чтобы автоматически генерировать клиентские или служебные заглушки как WRAPPED, все эти три элемента должны быть одинаковыми.

Обходной путь - написать собственные заглушки и использовать аннотации @ RequestWrapper / @ ResponseWrapper.

PS: Все операции portType должны иметь запрос / ответ в «обернутом» стиле.Даже малейшее отклонение, и оно по умолчанию будет BARE.

19 голосов
/ 21 августа 2013

Это обсуждение на Java Ranch Forum прояснило его для меня.В частности, этот пример сделан Джейсоном Ирвином :

BARE сгенерированный клиентом интерфейс (с использованием wsimport):

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)  
public interface IMathServer {  
    @WebMethod  
    @WebResult(name = "addNumsResponse")  
    public AddNumsResponse addNums(@WebParam(name = "addNums") AddNums parameters);  
}  

WRAPPED сгенерированный клиентом интерфейс (с использованием wsimport):

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)  
public interface IMathServer {  
    @WebMethod  
    @WebResult(name = "addNumsResponse")  
    public int addNums(@WebParam(name = "num1") int num1, @WebParam(name = "num2") int num2);  
}  

Оба эти фрагмента кода генерируют одно и то же сообщение:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">  
    <S:Body>  
        <ns2:addNums xmlns:ns2="http://SoapStyles/">  
            <num1>1</num1>  
            <num2>2</num2>  
        </ns2:addNums>  
    </S:Body>  
</S:Envelope>  

Как сказано R Srini вТо же самое обсуждается в параметрах, а не в коде.

Единственное отличие, генерирующее клиентов, заключается в том, как вы собираетесь создавать параметры в клиенте, но они оба будут генерировать одно и то же сообщение (упакованное или развернутое) в зависимости от службы WSDL.

С BARE у вас будет только верхний элемент (параметр) с «подпараметрами» внутри.Этот BARE будет отправлен напрямую (без «обертывания»).В то время как с WRAPPED у вас будут все эти «подпараметры» на первом уровне, и клиент автоматически обернет их в другой верхний элемент.

Цитируя Джейсона Ирвина:

Был передан только один параметр ("addNums"), и он был "голым" в теле.Во втором случае параметры были «голыми» в коде, но «обернутыми» во время выполнения JAX-WS.

Надеюсь, это поможет!

2 голосов
/ 29 июля 2013

Указывает, как параметры метода, которые соответствуют частям сообщения в контракте WSDL, помещаются в тело сообщения SOAP. Стиль параметра BARE означает, что каждый параметр помещается в тело сообщения как дочерний элемент корня сообщения. Стиль параметра WRAPPED означает, что все входные параметры заключены в один элемент в сообщении запроса и что все выходные параметры заключены в один элемент в ответном сообщении. Если вы установили стиль в RPC, вы должны использовать стиль параметра WRAPPED.

Ref http://cxf.apache.org/docs/developing-a-service.html

0 голосов
/ 13 ноября 2018

Как следует из названия, «ParameterStyle» меняет синтаксис передачи и получения параметров при вызове метода. И это имеет значение для клиентских артефактов, генерируемых wsimport, без какой-либо разницы в опубликованном сервисе и полезных нагрузках, которыми обмениваются клиенты / сервис. Если вы используете BARE с wsimport, то будет сгенерирован следующий код:

public int add(int num1, int num2)

Но если вы используете WRAPPED с wsimport, то

public void add(int num1, int num2, Holder result)

генерируется. И это принято с более ранних дней DCE / RPC.

...