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.