Randy Leonard created CXF-7062: ---------------------------------- Summary: wsdl2java generates incorrect @XmlElement(namespace=“…”) Key: CXF-7062 URL: https://issues.apache.org/jira/browse/CXF-7062 Project: CXF Issue Type: Bug Components: Soap Binding Affects Versions: 3.1.7 Environment: MacOSX 10.11, Java v1.8 Reporter: Randy Leonard Priority: Blocker
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. -- This message was sent by Atlassian JIRA (v6.3.4#6332)