I am using Apache CXF 3.1.7, and the wsdl2java command is generating code with
missing/incorrect namespace attributes on the @XMLEment annotation.
Note I generally use four distinct namespaces within each WSDL document, which
are as follows:
• Shared data types across many WSDL documents
(http://v1_0_0.datatypes.provider.soap.foundation.rps.com)
• Domain-specific data types
(http://v1_0_0.datatypes.provider.soap.common.masterdata.rps.com)
• Parameter types
(http://v1_0_0.parameters.provider.soap.common.masterdata.rps.com)
• Service types (http://v1_0_0.provider.soap.common.masterdata.rps.com)
This gives a nice separation of data types, and has worked quite well for me
with Axis2. I am having issues, however, when applying this approach to CXF.
Below is an example WSDL document with the namespaces defined above:
———————————————
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
targetNamespace="http://v1_0_0.provider.soap.common.masterdata.rps.com"
xmlns:foundationTypes="http://v1_0_0.datatypes.provider.soap.foundation.rps.com"
xmlns:masterdataCommonTypes="http://v1_0_0.datatypes.provider.soap.common.masterdata.rps.com"
xmlns:parameter="http://v1_0_0.parameters.provider.soap.common.masterdata.rps.com"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://v1_0_0.provider.soap.common.masterdata.rps.com"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/">
<wsdl:types>
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://v1_0_0.parameters.provider.soap.common.masterdata.rps.com"
>
<xs:import
namespace="http://v1_0_0.datatypes.provider.soap.foundation.rps.com"
schemaLocation="schemas/FoundationTypes.xsd" />
<xs:import
namespace="http://v1_0_0.datatypes.provider.soap.common.masterdata.rps.com"
schemaLocation="schemas/MasterDataCommonTypes.xsd" />
<xs:element name="consumerChannelFetchRequest">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element
name="paymentSchemeId" type="xs:string" minOccurs="0" />
<xs:element name="bin"
type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="consumerChannelFetchResponse">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="status"
type="foundationTypes:Status" />
<xs:element name="channels"
type="masterdataCommonTypes:ConsumerChannel" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="consumerChannelUpdateRequest">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element
name="paymentSchemeId" type="xs:string" minOccurs="0" />
<xs:element name="bin"
type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="consumerChannelUpdateResponse">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="status"
type="foundationTypes:Status" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="consumerChannelFetchMessageRequest">
<wsdl:part element="parameter:consumerChannelFetchRequest"
name="request" />
</wsdl:message>
<wsdl:message name="consumerChannelFetchMessageResponse">
<wsdl:part element="parameter:consumerChannelFetchResponse"
name="response" />
</wsdl:message>
<wsdl:message name="consumerChannelUpdateMessageRequest">
<wsdl:part element="parameter:consumerChannelUpdateRequest"
name="request" />
</wsdl:message>
<wsdl:message name="consumerChannelUpdateMessageResponse">
<wsdl:part element="parameter:consumerChannelUpdateResponse"
name="response" />
</wsdl:message>
<wsdl:portType name="ConsumerChannelPortType">
<wsdl:operation name="consumerChannelFetch">
<wsdl:input
message="tns:consumerChannelFetchMessageRequest"
name="consumerChannelFetchMessageRequest" />
<wsdl:output
message="tns:consumerChannelFetchMessageResponse"
name="consumerChannelFetchMessageResponse" />
</wsdl:operation>
<wsdl:operation name="consumerChannelUpdate">
<wsdl:input name="consumerChannelUpdateMessageRequest"
message="tns:consumerChannelUpdateMessageRequest" />
<wsdl:output
name="consumerChannelUpdateMessageResponse"
message="tns:consumerChannelUpdateMessageResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ConsumerChannelSoap12Binding"
type="tns:ConsumerChannelPortType">
<wsoap12:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="consumerChannelFetch">
<soap:operation soapAction="" style="document" />
<wsdl:input name="consumerChannelFetchMessageRequest">
<wsoap12:body use="literal" />
</wsdl:input>
<wsdl:output name="consumerChannelFetchMessageResponse">
<wsoap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="consumerChannelUpdate">
<soap:operation soapAction="" style="document" />
<wsdl:input name="consumerChannelUpdateMessageRequest">
<wsoap12:body use="literal" />
</wsdl:input>
<wsdl:output
name="consumerChannelUpdateMessageResponse">
<wsoap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ConsumerChannelService">
<wsdl:port name="ConsumerChannelSoap12Endpoint"
binding="tns:ConsumerChannelSoap12Binding">
<wsoap12:address
location="http://localhost:8080/axis2/services/ConsumerChannelService" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
———————————————
The following generated ConsumerChannelFetchResponse class contains no
namespace attribute for @XmlElement annotations, unless I include '-xjc-npa' in
the wsdl2java command. When including '-xjc-npa', I then get the incorrect
namespaces in the @XmlElement annotation. Both scenarios result in unmarshaling
errors on the client side:
———————————————
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained
within this class.
*
* <pre>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="status"
type="{http://v1_0_0.datatypes.provider.soap.foundation.rps.com}Status"/>
* <element name="channels"
type="{http://v1_0_0.datatypes.provider.soap.common.masterdata.rps.com}ConsumerChannel"
maxOccurs="unbounded" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"status",
"channels"
})
@XmlRootElement(name = "consumerChannelFetchResponse", namespace =
"http://v1_0_0.parameters.provider.soap.common.masterdata.rps.com")
public class ConsumerChannelFetchResponse {
@XmlElement(namespace =
"http://v1_0_0.parameters.provider.soap.common.masterdata.rps.com", required =
true)
protected Status status;
@XmlElement(namespace =
"http://v1_0_0.parameters.provider.soap.common.masterdata.rps.com")
protected List<ConsumerChannel> channels;
……….
———————————————
Note the namespace in the 'Status' variable @XmlElement annotation for the
above code should be:
• http://v1_0_0.datatypes.provider.soap.foundation.rps.com
But is the following instead:
• http://v1_0_0.parameters.provider.soap.common.masterdata.rps.com
A close examination of the comment block prior to the
ConsumerChannelFetchResponse class declaration indicates wsdl2java cleary
understands the Status type is from the correct class, but the namespace
attribute in the @XmlElement does not reflect this.
I've tried generating this class using both the cxf-codegen-plugin plugin, and
executing wsdl2java directly from the command line. Both to no avail.
My question is whether this is a known bug in CXF 3.1.7, or am I missing a
simple wsdl2java command line option to get desired results?
Thanks,
Randy