WebServices: голый vs завернутый?
Я генерирую некоторые WebServices из некоторого существующего wsdl
Я использую Maven для этого, но некоторые веб-службы генерируются с помощью
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
а остальные с
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
Jaxb или xjc делает это автоматически? потому что у меня нет никаких различий в wsdls...
Ответы
Ответ 1
Веб-службы BARE генерируются, когда имя "операция", имя "сообщение" и имя "element" различаются в какой-либо форме или форме. Чтобы автоматически создавать клиентские или служебные заглушки как WRAPPED, все эти три элемента должны быть одинаковыми.
Обходной путь к этому - написать свои собственные заглушки и использовать аннотации @RequestWrapper/@ResponseWrapper.
PS: Все операции portType должны иметь "завернутый" запрос/ответ стиля. Даже малейшее отклонение и по умолчанию будет BARE.
Ответ 2
Это обсуждение на форуме Java Ranch очистило его для меня. В частности, этот пример сделан Jason Irwin:
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" ), и он был "Bare" в тело. Во втором, параметры были "голыми" в коде, но "завернутый" во время выполнения JAX-WS.
Надеюсь, это поможет!
Ответ 3
Определяет, как параметры метода, которые соответствуют частям сообщения в контракте WSDL, помещаются в тело сообщения SOAP. Стиль параметра BARE означает, что каждый параметр помещается в тело сообщения как дочерний элемент корня сообщения. Стиль параметра WRAPPED означает, что все входные параметры завернуты в один элемент в сообщении запроса и что все выходные параметры завернуты в один элемент в ответном сообщении. Если вы установите стиль в RPC, вы должны использовать стиль параметра WRAPPED.
Ссылка
http://cxf.apache.org/docs/developing-a-service.html