Unmarshalling Error: unexpected element (uri: url, local: "objectname"). Expected elements: <{} objectname>
I am using jaxb2-marshaller to create classes to communicate with a webservice. Java classes are generated using some wsdl files.
Everything is ok now, but when I try to use some of the generated classes I got this unmarshalling error even though I am using the generated ObjectFactory classes.
Some of the stack:
org.springframework.ws.soap.client.SoapFaultClientException: Unmarshalling Error: unexpected element (uri:"http://xxxxxxxxx", local:"customer"). Expected elements are <{}customer> at org.springframework.ws.soap.client.core.SoapFaultMessageResolver.resolveFault(SoapFaultMessageResolver.java:38) at org.springframework.ws.client.core.WebServiceTemplate.handleFault(WebServiceTemplate.java:826) at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:621) at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:383) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:373) at einvoice.service.CustomerService.createCustomer(CustomerService.java:40) at einvoice.controller.facturatie.FacturatieOverzichtController.handleRenderRequest(FacturatieOverzichtController.java:36) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
And my class:
@Service public class CustomerService { @Autowired private WebServiceTemplate customerDaoTemplate; private ObjectFactory customerObjectFactory; public CustomerService() { customerObjectFactory = new ObjectFactory(); } public boolean createCustomer(Customer c) { System.out.println("CREATING CUSTOMER"); einvoice.proxy.customerdaoservice.Customer customer = customerObjectFactory.createCustomer(); customer.setConnectionURL("test"); customer.setUid("testuid"); customer.setName("KorneelTest"); Create create = customerObjectFactory.createCreate(); create.setCustomer(customer); try { customerDaoTemplate.marshalSendAndReceive(customerObjectFactory.createCreate(create)); return true; } catch(Exception ex) { ex.printStackTrace(); return false; } }
This is the createCustomer () method that shows this error.
The generated ObjectFactory class: // // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> // Any modifications to this file will be lost upon recompilation of the source schema. // Generated on: 2014.09.12 at 12:04:04 PM CEST // package einvoice.proxy.customerdaoservice; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlElementDecl; import javax.xml.bind.annotation.XmlRegistry; import javax.xml.namespace.QName; /** * This object contains factory methods for each * Java content interface and Java element interface * generated in the be.icredit.einvoice.proxy.customerdaoservice package. * <p>An ObjectFactory allows you to programatically * construct new instances of the Java representation * for XML content. The Java representation of XML * content can consist of schema derived interfaces * and classes representing the binding of schema * type definitions, element declarations and model * groups. Factory methods for each of these are * provided in this class. * */ @XmlRegistry public class ObjectFactory { private final static QName _AbstractFilter_QNAME = new QName("http://xxxxxxx/", "abstractFilter"); private final static QName _Customer_QNAME = new QName("http://xxxxxxx/", "customer"); private final static QName _FindSingleResponse_QNAME = new QName("http://xxxxxxx/", "findSingleResponse"); private final static QName _Create_QNAME = new QName("http://xxxxxxx/", "create"); private final static QName _Find_QNAME = new QName("http://xxxxxxx/", "find"); private final static QName _CreateResponse_QNAME = new QName("xxxxxxx/", "createResponse"); private final static QName _FindResponse_QNAME = new QName("http://xxxxxxx/", "findResponse"); private final static QName _UpdateResponse_QNAME = new QName("http://xxxxxxx/", "updateResponse"); private final static QName _FindSingle_QNAME = new QName("http://xxxxxxx/", "findSingle"); private final static QName _CustomerFilter_QNAME = new QName("http://xxxxxxx/", "customerFilter"); private final static QName _Update_QNAME = new QName("http://xxxxxxx/", "update"); private final static QName _AbstractEntity_QNAME = new QName("http://xxxxxxx/", "abstractEntity"); /** * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: be.icredit.einvoice.proxy.customerdaoservice * */ public ObjectFactory() { } /** * Create an instance of {@link Update } * */ public Update createUpdate() { return new Update(); } /** * Create an instance of {@link CustomerFilter } * */ public CustomerFilter createCustomerFilter() { return new CustomerFilter(); } /** * Create an instance of {@link UpdateResponse } * */ public UpdateResponse createUpdateResponse() { return new UpdateResponse(); } /** * Create an instance of {@link FindSingle } * */ public FindSingle createFindSingle() { return new FindSingle(); } /** * Create an instance of {@link FindResponse } * */ public FindResponse createFindResponse() { return new FindResponse(); } /** * Create an instance of {@link CreateResponse } * */ public CreateResponse createCreateResponse() { return new CreateResponse(); } /** * Create an instance of {@link FindSingleResponse } * */ public FindSingleResponse createFindSingleResponse() { return new FindSingleResponse(); } /** * Create an instance of {@link Customer } * */ public Customer createCustomer() { return new Customer(); } /** * Create an instance of {@link Create } * */ public Create createCreate() { return new Create(); } /** * Create an instance of {@link Find } * */ public Find createFind() { return new Find(); } /** * Create an instance of {@link Pager } * */ public Pager createPager() { return new Pager(); } /** * Create an instance of {@link JAXBElement }{@code <}{@link AbstractFilter }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "abstractFilter") public JAXBElement<AbstractFilter> createAbstractFilter(AbstractFilter value) { return new JAXBElement<AbstractFilter>(_AbstractFilter_QNAME, AbstractFilter.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link Customer }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "customer") public JAXBElement<Customer> createCustomer(Customer value) { return new JAXBElement<Customer>(_Customer_QNAME, Customer.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link FindSingleResponse }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "findSingleResponse") public JAXBElement<FindSingleResponse> createFindSingleResponse(FindSingleResponse value) { return new JAXBElement<FindSingleResponse>(_FindSingleResponse_QNAME, FindSingleResponse.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link Create }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "create") public JAXBElement<Create> createCreate(Create value) { return new JAXBElement<Create>(_Create_QNAME, Create.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link Find }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "find") public JAXBElement<Find> createFind(Find value) { return new JAXBElement<Find>(_Find_QNAME, Find.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link CreateResponse }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "createResponse") public JAXBElement<CreateResponse> createCreateResponse(CreateResponse value) { return new JAXBElement<CreateResponse>(_CreateResponse_QNAME, CreateResponse.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link FindResponse }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "findResponse") public JAXBElement<FindResponse> createFindResponse(FindResponse value) { return new JAXBElement<FindResponse>(_FindResponse_QNAME, FindResponse.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link UpdateResponse }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "updateResponse") public JAXBElement<UpdateResponse> createUpdateResponse(UpdateResponse value) { return new JAXBElement<UpdateResponse>(_UpdateResponse_QNAME, UpdateResponse.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link FindSingle }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "findSingle") public JAXBElement<FindSingle> createFindSingle(FindSingle value) { return new JAXBElement<FindSingle>(_FindSingle_QNAME, FindSingle.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link CustomerFilter }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "customerFilter") public JAXBElement<CustomerFilter> createCustomerFilter(CustomerFilter value) { return new JAXBElement<CustomerFilter>(_CustomerFilter_QNAME, CustomerFilter.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link Update }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "update") public JAXBElement<Update> createUpdate(Update value) { return new JAXBElement<Update>(_Update_QNAME, Update.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link AbstractEntity }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "abstractEntity") public JAXBElement<AbstractEntity> createAbstractEntity(AbstractEntity value) { return new JAXBElement<AbstractEntity>(_AbstractEntity_QNAME, AbstractEntity.class, null, value); } }
Package-info.java class:
// // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> // Any modifications to this file will be lost upon recompilation of the source schema. // Generated on: 2014.09.12 at 03:44:51 PM CEST // @javax.xml.bind.annotation.XmlSchema(namespace = "http://xxxxxxx/") package einvoice.proxy.customerdaoservice;
source share
- Either your original schema does not have the correct namespace.
- Or did you miss somehow
package-info.java
Please post your ObjectFactory
and package-info.java
(must be created next to ObjectFactory
).
You don't really need to instantiate your using ObjectFactory
, normal new
constructs work fine. :) ObjectFactory
not magic. It is mainly used by JAXB during dismantling.
ps. Please tag maven-jaxb2-plugin
with the tag maven-jaxb2-plugin
- it will speed up my attention.
source share
Please use the following annotation
@XmlRootElement(name="Customer")
in the root class as shown below. Since JAXb will not automatically generate the @XmlRootElement annotation, you need to manually place this annotation at the top of the class.
The generated ObjectFactory class: This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> // Any modifications to this file will be lost upon recompilation of the source schema. // Generated on: 2014.09.12 at 12:04:04 PM CEST // package einvoice.proxy.customerdaoservice; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlElementDecl; import javax.xml.bind.annotation.XmlRegistry; import javax.xml.namespace.QName; /** * This object contains factory methods for each * Java content interface and Java element interface * generated in the be.icredit.einvoice.proxy.customerdaoservice package. * <p>An ObjectFactory allows you to programatically * construct new instances of the Java representation * for XML content. The Java representation of XML * content can consist of schema derived interfaces * and classes representing the binding of schema * type definitions, element declarations and model * groups. Factory methods for each of these are * provided in this class. * */ @XmlRootElement(name="Customer") @XmlRegistry public class ObjectFactory { private final static QName _AbstractFilter_QNAME = new QName("http://xxxxxxx/", "abstractFilter"); private final static QName _Customer_QNAME = new QName("http://xxxxxxx/", "customer"); private final static QName _FindSingleResponse_QNAME = new QName("http://xxxxxxx/", "findSingleResponse"); private final static QName _Create_QNAME = new QName("http://xxxxxxx/", "create"); private final static QName _Find_QNAME = new QName("http://xxxxxxx/", "find"); private final static QName _CreateResponse_QNAME = new QName("xxxxxxx/", "createResponse"); private final static QName _FindResponse_QNAME = new QName("http://xxxxxxx/", "findResponse"); private final static QName _UpdateResponse_QNAME = new QName("http://xxxxxxx/", "updateResponse"); private final static QName _FindSingle_QNAME = new QName("http://xxxxxxx/", "findSingle"); private final static QName _CustomerFilter_QNAME = new QName("http://xxxxxxx/", "customerFilter"); private final static QName _Update_QNAME = new QName("http://xxxxxxx/", "update"); private final static QName _AbstractEntity_QNAME = new QName("http://xxxxxxx/", "abstractEntity"); /** * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: be.icredit.einvoice.proxy.customerdaoservice * */ public ObjectFactory() { } /** * Create an instance of {@link Update } * */ public Update createUpdate() { return new Update(); } /** * Create an instance of {@link CustomerFilter } * */ public CustomerFilter createCustomerFilter() { return new CustomerFilter(); } /** * Create an instance of {@link UpdateResponse } * */ public UpdateResponse createUpdateResponse() { return new UpdateResponse(); } /** * Create an instance of {@link FindSingle } * */ public FindSingle createFindSingle() { return new FindSingle(); } /** * Create an instance of {@link FindResponse } * */ public FindResponse createFindResponse() { return new FindResponse(); } /** * Create an instance of {@link CreateResponse } * */ public CreateResponse createCreateResponse() { return new CreateResponse(); } /** * Create an instance of {@link FindSingleResponse } * */ public FindSingleResponse createFindSingleResponse() { return new FindSingleResponse(); } /** * Create an instance of {@link Customer } * */ public Customer createCustomer() { return new Customer(); } /** * Create an instance of {@link Create } * */ public Create createCreate() { return new Create(); } /** * Create an instance of {@link Find } * */ public Find createFind() { return new Find(); } /** * Create an instance of {@link Pager } * */ public Pager createPager() { return new Pager(); } /** * Create an instance of {@link JAXBElement }{@code <}{@link AbstractFilter }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "abstractFilter") public JAXBElement<AbstractFilter> createAbstractFilter(AbstractFilter value) { return new JAXBElement<AbstractFilter>(_AbstractFilter_QNAME, AbstractFilter.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link Customer }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "customer") public JAXBElement<Customer> createCustomer(Customer value) { return new JAXBElement<Customer>(_Customer_QNAME, Customer.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link FindSingleResponse }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "findSingleResponse") public JAXBElement<FindSingleResponse> createFindSingleResponse(FindSingleResponse value) { return new JAXBElement<FindSingleResponse>(_FindSingleResponse_QNAME, FindSingleResponse.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link Create }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "create") public JAXBElement<Create> createCreate(Create value) { return new JAXBElement<Create>(_Create_QNAME, Create.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link Find }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "find") public JAXBElement<Find> createFind(Find value) { return new JAXBElement<Find>(_Find_QNAME, Find.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link CreateResponse }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "createResponse") public JAXBElement<CreateResponse> createCreateResponse(CreateResponse value) { return new JAXBElement<CreateResponse>(_CreateResponse_QNAME, CreateResponse.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link FindResponse }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "findResponse") public JAXBElement<FindResponse> createFindResponse(FindResponse value) { return new JAXBElement<FindResponse>(_FindResponse_QNAME, FindResponse.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link UpdateResponse }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "updateResponse") public JAXBElement<UpdateResponse> createUpdateResponse(UpdateResponse value) { return new JAXBElement<UpdateResponse>(_UpdateResponse_QNAME, UpdateResponse.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link FindSingle }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "findSingle") public JAXBElement<FindSingle> createFindSingle(FindSingle value) { return new JAXBElement<FindSingle>(_FindSingle_QNAME, FindSingle.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link CustomerFilter }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "customerFilter") public JAXBElement<CustomerFilter> createCustomerFilter(CustomerFilter value) { return new JAXBElement<CustomerFilter>(_CustomerFilter_QNAME, CustomerFilter.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link Update }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "update") public JAXBElement<Update> createUpdate(Update value) { return new JAXBElement<Update>(_Update_QNAME, Update.class, null, value); } /** * Create an instance of {@link JAXBElement }{@code <}{@link AbstractEntity }{@code >}} * */ @XmlElementDecl(namespace = "http://xxxxxxx/", name = "abstractEntity") public JAXBElement<AbstractEntity> createAbstractEntity(AbstractEntity value) { return new JAXBElement<AbstractEntity>(_AbstractEntity_QNAME, AbstractEntity.class, null, value); }
}
source share
If you have more than one module in your project, check for duplicate class names or directory names.
I was getting the same error and I was able to solve it by changing the package names in my project.
I had two modules in my project with the same directory structures module/src/main/java/com/example/directory/path
We had two different endpoints and two different WSDLs, but they were both from the same client. When we automatically generated POJO classes from WSDL, it created a file structure for us. I noticed that the namespace generated in XML was using the same namespace for XML generated in both modules when they should have been different (hence the stacktrace).
All I did to solve the problem was that the directory names were more specific to each module.
source share
I think I found the problem.
I used maven-jaxb2 plugin version 0.9.0. This version gave me a strange exception! I reverted to version of the plugin maven-jaxbe2 0.8.3, this version gives a 404 error:
08:56:45,212 ERROR [DispatcherPortlet:572] Could not complete request org.springframework.ws.client.WebServiceTransportException: Not Found [404] at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:695) at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:606) at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:383) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:373) at be.icredit.einvoice.service.CustomerService.createCustomer(CustomerService.java:43) at be.icredit.einvoice.controller.facturatie.FacturatieOverzichtController.handleRenderRequest(FacturatieOverzichtController.java:36)
source share
This trace is created because of the request and response message names, is not the same in WSDL and java class:
Disclaimer:
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "acceptMessageResponse", propOrder = { "acceptMessageReturn" }) public class AcceptMessageResponse { @XmlElement(required = true) protected String acceptMessageReturn; public String getAcceptMessageReturn() { return acceptMessageReturn; } public void setAcceptMessageReturn(String value) { this.acceptMessageReturn = value; } }
Accept message:
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "acceptMessage", propOrder = { "in0" }) public class AcceptMessage { @XmlElement(required = true) protected String in0; public String getIn0() { return in0; } public void setIn0(String value) { this.in0 = value; } }
In this example, the WSDL should define: 1.
<?xml version='1.0' encoding='UTF-8'?> <wsdl:definitions name="PORX_IN02016001SACYL" targetNamespace="http://components.mule.server.mirth.webreach.com" xmlns:ns1="http://cxf.apache.org/bindings/xformat" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://components.mule.server.mirth.webreach.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <xs:schema elementFormDefault="qualified" targetNamespace="http://components.mule.server.mirth.webreach.com" version="1.0" xmlns:tns="http://components.mule.server.mirth.webreach.com" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="acceptMessage"> <xs:complexType> <xs:sequence> <xs:element form="unqualified" name="in0" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="acceptMessageResponse" nillable="true" type="xs:anyType" /> <xs:complexType name="acceptMessageResponse"> <xs:sequence /> </xs:complexType> </xs:schema> </wsdl:types> <wsdl:message name="acceptMessage"> <wsdl:part element="tns:acceptMessage" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="acceptMessageResponse"> <wsdl:part element="tns:acceptMessageResponse" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:portType name="PORX_IN02016001SACYL"> <wsdl:operation name="acceptMessage"> <wsdl:input message="tns:acceptMessage" name="acceptMessage"> </wsdl:input> <wsdl:output message="tns:acceptMessageResponse" name="acceptMessageResponse"> </wsdl:output> </wsdl:operation> </wsdl:portType> <wsdl:binding name="PORX_IN02016001SACYLSoapBinding" type="tns:PORX_IN02016001SACYL"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="acceptMessage"> <soap:operation soapAction="" style="document" /> <wsdl:input name="acceptMessage"> <soap:body use="literal" /> </wsdl:input> <wsdl:output name="acceptMessageResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="PORX_IN02016001SACYL"> <wsdl:port binding="tns:PORX_IN02016001SACYLSoapBinding" name="PORX_IN02016001SACYL"> <soap:address location="http://localhost:8080/vere/services/PORX_IN02016001SACYL" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
source share