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
