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>
 * &lt;complexType&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="status" 
type="{http://v1_0_0.datatypes.provider.soap.foundation.rps.com}Status"/&gt;
 *         &lt;element name="channels" 
type="{http://v1_0_0.datatypes.provider.soap.common.masterdata.rps.com}ConsumerChannel";
 maxOccurs="unbounded" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </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


  


Reply via email to