I have been using cxf-codegen-plugin to generate java code from wsdl. We
publish a web service using Cxf 2.4.2. It has worked fine but I now have a
requirement to unmarshal an XML string into java objects. The string
represents part of the result that my web service shall return. I do this
as follows (same code works in other applications):

*    final JAXBContext context = JAXBContext.newInstance(LogEntries.class);*
*    final Unmarshaller unMarshaller = context.createUnmarshaller();*
*    LogEntries logEntries = (LogEntries) unMarshaller.unmarshal(new
StreamSource(new StringReader(theXml)));*

Thus, "LogEntries" is a java class generated using cxf-codegen-plugin. The
above fails with the following exception:

*Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected
element (uri:"http://www.digia.se/wsdl/cws/v2";, local:"logEntries").
Expected elements are (none)*
* at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642)
*
* at
com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:254)
*
* at
com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:249)
*
* at
com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116)
*
* at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1049)
*
* at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:478)
*
* at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459)
*
* at
com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:148)
*
* at
com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown
Source)*
* at
com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown
Source)*
* at
com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(Unknown
Source)*
* at
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown
Source)*
* at
com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown
Source)*
* at
com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown
Source)*
* at
com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown
Source)*
* at
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown
Source)*
* at
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown
Source)*
* at
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown
Source)*
* at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown
Source)*
* at
com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown
Source)*
* at
com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown
Source)*
* at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:211)
*
* at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184)
*
* at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown
Source)*
* at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown
Source)*
* at
se.capitalc.cws.ws.server.integration.cxa.impl.CXAServiceImpl.string2LogEntries(CXAServiceImpl.java:789)
*
* at
se.capitalc.cws.ws.server.integration.cxa.impl.CXAServiceImpl.main(CXAServiceImpl.java:1020)
*

What surprsed me is the message: "Expected elements are (none)". I
therefore looked at the generated code. Here is an excerpt from the
LogEntries class:

*@XmlAccessorType(XmlAccessType.FIELD)*
*@XmlType(name = "LogEntries", propOrder = {*
*    "logEntry"*
*})*
*public class LogEntries {*
*
*
*    protected List<LogEntry> logEntry;*
*...*

Note that the "logEntry" field is not annotated with @XmlElement. I think
this is the reason of the exception but I do not understand why there is no
XmlElement annotation.

I have a wsdl that imports several xml schema files. One of my web service
methods return a "History" complex type:

*      <element name="getHistoryResponse" type="tns:History" />*

The History type is defined in a separate file, History.xsd as follows:

*<?xml version="1.0" encoding="UTF-8"?>*
*<schema xmlns="http://www.w3.org/2001/XMLSchema"; targetNamespace="
http://www.digia.se/wsdl/cws/v2"*
*  xmlns:tns="http://www.digia.se/wsdl/cws/v2";
elementFormDefault="qualified" attributeFormDefault="unqualified">*
*
*
*  <complexType name="LogEntries">*
*    <sequence>*
*      <element name="logEntry" minOccurs="0" maxOccurs="unbounded"
type="tns:LogEntry"/>*
*    </sequence>*
*  </complexType>*
*
*
*  <complexType name="LogEntry">*
*    <sequence>*
*      <element name="changedValues" type="tns:ChangedValues" minOccurs="0"
maxOccurs="1"/>*
*      <element name="allValues" type="tns:AllValues" minOccurs="0"
maxOccurs="1"/>*
*    </sequence>*
*    <attribute name="by" type="string" use="required"/>*
*    <attribute name="when" type="dateTime" use="required"/>*
*    <attribute name="logType" type="tns:LogType" use="required"/>*
*    <attribute name="entityType" type="tns:EntityType" use="required"/>*
*  </complexType>*
*
*
*  <complexType name="ChangedValues">*
*    <sequence>*
*      <element name="changedValue" minOccurs="0" maxOccurs="unbounded"
type="tns:ChangedValue"/>*
*    </sequence>*
*  </complexType>*
*
*
*  <complexType name="AllValues">*
*    <sequence>*
*      <element name="value" minOccurs="0" maxOccurs="unbounded"
type="tns:Value"/>*
*    </sequence>*
*  </complexType>*
*
*
*  <complexType name="ChangedValue">*
*    <sequence>*
*      <element name="name" type="string"/>*
*      <element name="before" type="string" minOccurs="0"/>*
*      <element name="after" type="string" minOccurs="0"/>*
*    </sequence>*
*  </complexType>*
*
*
*  <complexType name="Value">*
*    <sequence>*
*      <element name="name" type="string"/>*
*      <element name="value" type="string"/>*
*    </sequence>*
*  </complexType>*
*
*
*  <simpleType name="LogType">*
*    <annotation>*
*      <documentation>*
*        N = New*
*        U = Update*
*        D = Delete*
*      </documentation>*
*    </annotation>*
*    <restriction base="string">*
*      <enumeration value="N"/>*
*      <enumeration value="U"/>*
*      <enumeration value="D"/>*
*    </restriction>*
*  </simpleType>*
*
*
*  <simpleType name="EntityType">*
*    <annotation>*
*      <documentation>*
*        C = Customer*
*      </documentation>*
*    </annotation>*
*    <restriction base="string">*
*      <enumeration value="C"/>*
*    </restriction>*
*  </simpleType>*
*
*
*
*
*  <complexType name="History">*
*    <sequence>*
*      <element name="logEntries" type="tns:LogEntries" />*
*    </sequence>*
*  </complexType>*
*</schema>*

I invoke the cxf-codegen-plugin as follws:

*      <plugin>*
*        <groupId>org.apache.cxf</groupId>*
*        <artifactId>cxf-codegen-plugin</artifactId>*
*        <version>${cxf.version}</version>*
*        <executions>*
*          <execution>*
*            <id>Wsdl2java</id>*
*            <phase>generate-sources</phase>*
*            <configuration>*
*              <sourceRoot>${project.build.directory}/generated-sources*
*              </sourceRoot>*
*              <wsdlOptions>*
*                <wsdlOption>*
*
<wsdl>${basedir}/src/main/resources/wsdl/cwsfull.wsdl</wsdl>*
*                  <extraargs>*
*                    <extraarg>-p</extraarg>*
*                    <extraarg>se.capitalc.cws.api</extraarg>*
*                    <extraarg>-wsdlLocation</extraarg>*
*                    <wsdlurl />*
*                  </extraargs>*
*                </wsdlOption>*
*              </wsdlOptions>*
*            </configuration>*
*            <goals>*
*              <goal>wsdl2java</goal>*
*            </goals>*
*          </execution>*
*        </executions>*
*      </plugin>*

Can anyone help me to understand why the XmlElement annotations are missing
and possibly advice me how to fix this?

/Bengt

Reply via email to