Details
-
Bug
-
Status: Closed
-
Blocker
-
Resolution: Not A Problem
-
3.1.7
-
None
-
MacOSX 10.11, Java v1.8
-
Unknown
Description
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.