I don’t think it’s possible that that would be a valid WSDL. The element tags for the message parts must point to a top level element. It cannot point to a child element of another structure.
Any chance to see the full WSDL as well as the code you are using to try and invoke on the service? I assume you are using the generated stubs. With that schema, the method signature for the method SHOULD be something like: TLETSMessge doFoo(TLETSMessge msg); And you’d have to construct the full TLETSMessage object to pass in. Dan > On Oct 17, 2018, at 6:06 PM, Arnold Morein <arnie.mor...@me.com.INVALID> > wrote: > > > CXF: 3.1.10 > JDK 1.8 > Tomcat 8.0.18 > > I have a situation with a WSDL that is very terse and the resultant stubs, > though they compile in the WSDL’s JAR project, cannot be used in the main > application’s WAR project. > > The WSDL’s single message structure is like this: > > Message > ----(2 string attributes) > --Header > ----(4 string attributes) > --Body > ----(sequence) > ------Request > --------(xsd:any) > ------Response > --------(xsd:any) > > The first problem was that the classes weren’t serializable. So I started > building a binding file to add that aspect. That part was easy. > > But the Header, Body, Response, and Request classes are generated as internal > static sub-classes of Message (because in the WSDL schema section, they are > all internal to the Message). > > When CXF tries to marshal a call to the service, an exception occurs saying: > > org.apache.cxf.interceptor.Fault: Marshalling Error: unable to marshal type > "a.b.Message$Header" as an element because it is missing an @XmlRootElement > annotation > > The Message class has an @XmlRootElement annotation, but not the subclasses. > The class looks like this: > > @XmlAccessorType(XmlAccessType.FIELD) > @XmlType(name = "", propOrder = { > "content" > }) > @XmlRootElement(name = "TLETSMessage") > public class TLETSMessage > implements Serializable > { > > private final static long serialVersionUID = 1L; > @XmlElementRefs({ > @XmlElementRef(name = "Header", type = JAXBElement.class), > @XmlElementRef(name = "Body", type = JAXBElement.class) > }) > @XmlMixed > protected List<Serializable> content; > @XmlAttribute(name = "key", required = true) > protected String key; > @XmlAttribute(name = "version", required = true) > protected String version; > > public List<Serializable> getContent() { > if (content == null) { > content = new ArrayList<Serializable>(); > } > return this.content; > } > … > > @XmlAccessorType(XmlAccessType.FIELD) > @XmlType(name = "", propOrder = { > "request", > "response" > }) > public static class Body > implements Serializable > { > > private final static long serialVersionUID = 1L; > @XmlElement(name = "Request", required = true) > protected TLETSMessage.Body.Request request; > @XmlElement(name = "Response") > protected TLETSMessage.Body.Response response; > > public TLETSMessage.Body.Request getRequest() { > return request; > } > > public void setRequest(TLETSMessage.Body.Request value) { > this.request = value; > } > > public TLETSMessage.Body.Response getResponse() { > return response; > } > … > > I then added entries to the binding file and pom.xml to add the > @XmlRootElement annotation to the Header and Body classes: > > <?xml version="1.0" encoding="UTF-8"?> > <bindings xmlns="http://java.sun.com/xml/ns/jaxb > <http://java.sun.com/xml/ns/jaxb>" > xmlns:annox="http://annox.dev.java.net <http://annox.dev.java.net/>" > extensionBindingPrefixes="xjc annox" > xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc > <http://java.sun.com/xml/ns/jaxb/xjc>" > xmlns:xsd="http://www.w3.org/2001/XMLSchema > <http://www.w3.org/2001/XMLSchema>" > xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/ > <http://schemas.xmlsoap.org/wsdl/>" version="2.1" >> > <globalBindings> > <serializable uid="1" /> > </globalBindings> > > <bindings schemaLocation="META-INF/DMVService.wsdl#types1" > node="/xsd:schema" >> > > <!-- Annotate the following classes with XmlRootElement --> > <bindings node="//xsd:element[@name='Header']"> > <annox:annotate> > <annox:annotate > annox:class="javax.xml.bind.annotation.XmlRootElement" > name="Header" /> > </annox:annotate> > </bindings> > > <bindings node="//xsd:element[@name='Body']"> > <annox:annotate> > <annox:annotate > annox:class="javax.xml.bind.annotation.XmlRootElement" > name="Body" /> > </annox:annotate> > </bindings> > > </bindings> > > </bindings> > > And I thought I had it done, but what is generated is wrong, the annotation > is put on a method that isn’t explicit in the WSDL so I guess a generic one > was generated. > > @XmlRootElement(name = "Body") > public List<Serializable> getContent() { > if (content == null) { > content = new ArrayList<Serializable>(); > } > return this.content; > } > > But not where I hoped it would be: > > @XmlAccessorType(XmlAccessType.FIELD) > @XmlType(name = "", propOrder = { > "request", > "response" > }) > public static class Body > implements Serializable > { > > Here is an extract from the WSDL, hopefully someone can tell me how to fix > the binding? > > <wsdl:types> > <xsd:schema xmlns="http://www.openfox.com <http://www.openfox.com/>" > targetNamespace="http://www.openfox.com <http://www.openfox.com/>" >> > <!-- TLETSMessage --> > <xsd:element name="TLETSMessage"> > <xsd:complexType mixed="true"> > <xsd:sequence> > <!-- Header --> > <xsd:element name="Header"> > <xsd:complexType> > <xsd:sequence> > <!-- Initiator --> > <xsd:element name="Initiator"> > <xsd:simpleType> > <xsd:restriction > base="xsd:string" >> > <xsd:maxLength > value="9" >> </xsd:maxLength> > <xsd:minLength > value="4" >> </xsd:minLength> > </xsd:restriction> > </xsd:simpleType> > </xsd:element> > > <!-- Destination --> > <xsd:element name="Destination"> > <xsd:simpleType> > <xsd:restriction > base="xsd:string" >> > <xsd:maxLength > value="9" >> </xsd:maxLength> > <xsd:minLength > value="2" >> </xsd:minLength> > </xsd:restriction> > </xsd:simpleType> > </xsd:element> > > <!-- ControlField --> > <xsd:element name="ControlField"> > <xsd:simpleType> > <xsd:restriction > base="xsd:string" >> > <!--xsd:pattern value="\d{6}"/--> > <xsd:length > value="10" >> </xsd:length> > </xsd:restriction> > </xsd:simpleType> > </xsd:element> > > <!-- UserId --> > <xsd:element name="UserId"> > <xsd:simpleType> > <xsd:restriction > base="xsd:string" >> > <xsd:length > value="7"></xsd:length> > </xsd:restriction> > </xsd:simpleType> > </xsd:element> > </xsd:sequence> > </xsd:complexType> > </xsd:element> <!-- end Header --> > > <!-- Body --> > <xsd:element name="Body"> > <xsd:complexType> > <xsd:sequence> > <xsd:element name="Request"> > <xsd:complexType> > <xsd:sequence> > <xsd:any></xsd:any> > </xsd:sequence> > </xsd:complexType> > </xsd:element> > <xsd:element name="Response" > minOccurs="0" maxOccurs="1" >> > <xsd:complexType> > <xsd:sequence> > <xsd:any></xsd:any> > </xsd:sequence> > </xsd:complexType> > </xsd:element> > </xsd:sequence> > </xsd:complexType> > </xsd:element> > </xsd:sequence> > <!-- TLETSMessage attributes --> > <xsd:attribute name="key" type="xsd:string" > use="required" >> </xsd:attribute> > <xsd:attribute name="version" > type="xsd:string" use="required" >> </xsd:attribute> > </xsd:complexType> > </xsd:element> <!-- end TLETSMessage --> > </xsd:schema> -- Daniel Kulp dk...@apache.org <mailto:dk...@apache.org> - http://dankulp.com/blog <http://dankulp.com/blog> Talend Community Coder - http://talend.com <http://coders.talend.com/>