Веб-сервисы: голые или завернутые?

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

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

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)  

и другие с

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 

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


person Cris    schedule 16.03.2011    source источник
comment
Не могли бы вы опубликовать свой файл wsdl?   -  person Padmarag    schedule 16.03.2011
comment
XJC этого не делает, это работа инструмента wsimport.   -  person skaffman    schedule 16.03.2011


Ответы (4)


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

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

PS: Все операции portType должны иметь "обернутый" стиль запроса/ответа. Даже малейшее отклонение, и он по умолчанию будет БЕЗОПАСНЫМ.

person lonewolf    schedule 25.05.2011
comment
Четкий и полезный ответ! Спасибо. - person Geert Schuring; 04.02.2013
comment
Есть ли официальная документация, которая объясняет это дальше? Документ спецификации может быть? - person Muhammad Gelbana; 18.03.2013
comment
спецификация JAX-WS 2.1 объясняет это в Разделе 2.3.1.2 ( Стиль обертки) - person Michael R; 20.03.2015

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

ГЛУБОЙ интерфейс, сгенерированный клиентом (с использованием 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 во время выполнения.

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

person Christian Vielma    schedule 20.08.2013

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

Ссылка http://cxf.apache.org/docs/developing-a-service.html

person Yukti Kaura    schedule 29.07.2013

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

public int add(int num1, int num2)

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

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

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

person Community    schedule 12.11.2018