cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Timo Heck (JIRA)" <j...@apache.org>
Subject [jira] Created: (CXF-3105) jaxws customization parameter renaming not working
Date Mon, 01 Nov 2010 09:21:28 GMT
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:portType[@name='flowcenter']/wsdl:operation[@name='login']">
  <jaxws:parameter part="wsdl:definitions/wsdl:message[@name='loginRequest']/wsdl:part[@name='parameters']"
childElementName="login" name="loginRequest"/>
  <jaxws:parameter part="wsdl:definitions/wsdl:message[@name='loginResponse']/wsdl:part[@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:portType[@name='flowcenter']/wsdl:operation[@name='login']">
  <jaxws:parameter part="wsdl:definitions/wsdl:message[@name='loginRequest']/wsdl:part[@name='parameters']"
childElementName="login" name="loginRequest"/>
  </jaxws:bindings>
<jaxws:bindings node="wsdl:definitions/wsdl:portType[@name='flowcenter']/wsdl:operation[@name='login']">
  <jaxws:parameter part="wsdl:definitions/wsdl:message[@name='loginResponse']/wsdl:part[@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.


Mime
View raw message