Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WebServices : bare vs wrapped?

I generate some WebServices out of some existing wsdl

I use Maven to do this but some webservices are generated with

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)  

and the others with

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 

Jaxb or xjc does this automatically ? because i do not have any differences in the wsdls...

like image 422
Cris Avatar asked Mar 16 '11 10:03

Cris


2 Answers

BARE webservices are generated when the 'operation' name, the 'message' name and the 'element' name are different in some shape or form. To auto generate your client or service stubs as WRAPPED, all of those three elements must be the same.

The workaround to that is to write your own stubs and use the @RequestWrapper/@ResponseWrapper annotations.

PS: All of the portType operations must have a 'wrapped' style request/response. Even the slightest deviation and it will default to BARE.

like image 73
lonewolf Avatar answered Sep 29 '22 06:09

lonewolf


This discussion at Java Ranch Forum cleared it for me. Specifically this example made by Jason Irwin:

BARE client generated interface (using wsimport):

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

WRAPPED client generated interface (using 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);  
}  

This both pieces of code generate the same message:

<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>  

As said by R Srini in the same discussion what is wrapped are the parameters, not the code.

The only difference generating the clients is the way you are going to create the params in the client, but they both are going to generate the same message (wrapped or unwrapped) depending on the service WSDL.

With BARE you will have only a top element (parameter) with "sub-parameters" inside. This one BARE will be sent directly (without "wrapping" it). While with WRAPPED you will have all this "sub-parameters" in the first level, and the client automatically wrap them in another top element.

Quoting Jason Irwin:

Only one parameter was passed ("addNums") and it was "Bare" in the body. In the second, the parameters were "bare" in the code, but "wrapped" at run-time by JAX-WS.

Hope this helps!

like image 34
Christian Vielma Avatar answered Sep 29 '22 05:09

Christian Vielma