pátek 14. prosince 2012

JAX-WS: Generování z WSDL a podivný SOAPBinding


Pokud se vám stane, že píšete WSDL a z něj generujete potřebné třídy v Javě, přičemž se vám nad "port třídou" pořád objevuje protivná anotace
@SOAPBinding(parameterStyle=ParameterStyle.BARE)
- a to i přestože se zoufale pokoušíte v bindings měnit nastavení enableWrapperStyle na false/true, aniž by to mělo jakýkoliv efekt, vězte, že krom nutných podmínek, o nichž se dočtete na webu, musíte splnit ještě jednu zásadní, která z popisů různých kombinací RPC/Document/Wrapped tak nějak vyplývá, ale nedochází vám.
Možná vám tato podmínka dojde, když se podíváte, kde všude se vyskytuje "MyOperation" v následující ukázce:

<wsdl:binding name="MyBinding" type="MyServicePort">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="MyOperation">
...
<wsdl:portType name="MyServicePort">
<wsdl:operation name="MyOperation">
<wsdl:input message="MyOperation"/>
...
<wsdl:message name="MyOperation">
<wsdl:part name="parameters" element="data:MyOperation"/>
</wsdl:message>
...
<wsdl:types>
<xsd:element name="MyOperation" type="data:MujPozadavekTyp"/>
...

Zkoušel jsem různé změny do úmoru - jakmile jsem některé ze jmen změnil, objevila se anotace a interface obsahoval vstupní parametr typu MyOperation, zatímco takto anotace v kódu nebyla a vstupní parametry odpovídaly sekvenci atributů elementu MyOperation.
Samozřejmě, pokud by metoda služby měla parametrů více, než je zdrávo, budu chtít docílit pravého opaku ...

Tak, a je to venku - a teď můžete pokračovat v práci :-)