jaxws customization parameter renaming not working
--------------------------------------------------

                 Key: CXF-3105
                 URL: https://issues.apache.org/jira/browse/CXF-3105
             Project: CXF
          Issue Type: Bug
    Affects Versions: 2.2.11
            Reporter: Timo Heck


Hi,

I am working on this for a couple of days now with actually finding a solution. 
I am building a ws client from wsdl with CXF wsdl2Java version 2.2.11.

The problem is an element naming issue in the wsdl. As far as I do understand I 
have three choices:
1. disable wrapper style
2. use autoNameResolution feature
3. write my own customization and rename the parameters

I verified options 1 and 2. Both solves the problem. But I'd like to have more 
control over the generated interface so I'd like to explicitly set the 
parameter names.

This is how it looks like:
Wsdl describes a webservice with a method called login().
This is how request and response definitions look like.

<xsd:element name="login">
            <xsd:complexType>
            <xsd:sequence>
            <xsd:element name="login" type="fc:flowloginrequest"/>
            <xsd:element name="switchusergroup" type="xsd:int" maxOccurs="1" 
minOccurs="0"/>
            </xsd:sequence>
            </xsd:complexType>
            </xsd:element>

            <xsd:element name="loginResponse">
            <xsd:complexType>
            <xsd:sequence>
            <xsd:element name="login" type="fc:flowloginresponse"/>
            <xsd:element name="password_temp" type="xsd:string"/>
            <xsd:element name="usergrouplist" type="fc:flowidnamepairs"/>
            <xsd:element name="permissions" type="xsd:string"/>
            <xsd:element name="usertype" type="xsd:string"/>
            <xsd:element name="usertypeid" type="xsd:string"/>
            </xsd:sequence>
            </xsd:complexType>
            </xsd:element>

Request and response both hold a local element called login. This is causing 
the trouble I have and if I try to generate code with wrapper style enabled 
this is what I get:
WSDLToJava Error: Element login has the same name with different types

If I rename the two local elements to loginRequest (fc:flowloginrequest) and 
loginResponse (fc:flowloginresponse) everything runs just fine. Since I can't 
actually adjust the schema (it's not mine) I have to write my own customization 
file.

To solve the problem I wanted to rename the method parameter for both elements. 
This is what found by examining JAX-WS spec.

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings wsdlLocation="flowcenter.wsdl"
          xmlns:jaxws="http://java.sun.com/xml/ns/jaxws";
          xmlns:xs="http://www.w3.org/2001/XMLSchema";
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
          xmlns:jaxb="http://java.sun.com/xml/ns/jaxb";
          xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
          xmlns:fc="http://www.flowworks.de/flowworks/";
          xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb 
http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd
          http://java.sun.com/xml/ns/jaxws 
http://java.sun.com/xml/ns/jaxws/wsdl_customizationschema_2_0.xsd";>
 
  <!-- rename method parameters-->  
  <jaxws:bindings 
node="wsdl:definitions/wsdl:portty...@name='flowcenter']/wsdl:operati...@name='login']">
  <jaxws:parameter 
part="wsdl:definitions/wsdl:messa...@name='loginRequest']/wsdl:pa...@name='parameters']"
 childElementName="login" name="loginRequest"/>
  <jaxws:parameter 
part="wsdl:definitions/wsdl:messa...@name='loginResponse']/wsdl:pa...@name='parameters']"
 childElementName="login" name="loginResponse"/>
  </jaxws:bindings>
</jaxws:bindings>

I thought this would do the trick but it doesn't. Even more confusing is that 
if I run the tool with -autoNameResolution and check the code the service 
interface does show part of my declared names above. It looks like this.

login( Flowloginrequest loginResponse,
        Integer switchusergroup,
        Holder<Flowloginresponse> login,
        Holder<java.lang.String> passwordTemp,
        Holder<Flowidnamepairs> usergrouplist,
        Holder<java.lang.String> permissions,
        Holder<java.lang.String> usertype,
        Holder<java.lang.String> usertypeid
    )

Note the login parameter from request is renamed to loginResponse and response 
parameter name is ignored. To make this a little more interesting I changed the 
binding declaration to this:

<!-- rename method parameters-->  
  <jaxws:bindings 
node="wsdl:definitions/wsdl:portty...@name='flowcenter']/wsdl:operati...@name='login']">
  <jaxws:parameter 
part="wsdl:definitions/wsdl:messa...@name='loginRequest']/wsdl:pa...@name='parameters']"
 childElementName="login" name="loginRequest"/>
  </jaxws:bindings>
<jaxws:bindings 
node="wsdl:definitions/wsdl:portty...@name='flowcenter']/wsdl:operati...@name='login']">
  <jaxws:parameter 
part="wsdl:definitions/wsdl:messa...@name='loginResponse']/wsdl:pa...@name='parameters']"
 childElementName="login" name="loginResponse"/>
  </jaxws:bindings>

This is what the method signature looks like:

login( Flowloginrequest loginRequest,
        Integer switchusergroup,
        Holder<Flowloginresponse> login,
        Holder<java.lang.String> passwordTemp,
        Holder<Flowidnamepairs> usergrouplist,
        Holder<java.lang.String> permissions,
        Holder<java.lang.String> usertype,
        Holder<java.lang.String> usertypeid
    )

So I think I am not completely wrong trying to solve this issue by applying a 
customization file but something is not working right.
I'll try to provide a test case and patch here too.

Timo

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to