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