Ethan
Ethan

Reputation: 315

javax.xml.bind.UnmarshalException: unexpected element (uri:""

I am getting an exception while turning an XML response from a service to a POJO. The XML looks like this:

Here is my XML response.

javax.xml.bind.UnmarshalException: unexpected element (uri:""
, local:"ItemSearchResponse"). Expected elements are
<{http://webservices.amazon.com/AWSECommerceService/2011-08-01}ItemSearchResponse>

I am using it like this:

 Document response = getResponse(url);
 JAXBContext context = JAXBContext.newInstance(AmazonItem.class);
 Unmarshaller unMarshaller = context.createUnmarshaller();
 newItem = (AmazonItem) unMarshaller.unmarshal(response);

Below are the details of my files

package-info.java

@XmlSchema(
        namespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01",
        elementFormDefault = XmlNsForm.QUALIFIED)

package com.services.amazon;


import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

AmazonItem.java

@XmlRootElement(name="ItemSearchResponse")
@XmlAccessorType(XmlAccessType.FIELD)
public class AmazonItem
{
    @XmlElement(name="Items")
    private Items items = null;
}

Items.java

@XmlAccessorType(XmlAccessType.FIELD)
public class Items { 
    @XmlElement(name="Item")
    List<Item> items = new ArrayList();
}

Item.java

@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
    @XmlElement(name="ASIN")
    private String asin;

    @XmlElement(name="ItemAttributes")
    private ItemAttributes attributes;

    @XmlElement(name="ItemLinks")
    private List<ItemLinks> itemLinks;
}

ItemAttributes.java

@XmlAccessorType(XmlAccessType.FIELD)
public class ItemAttributes {
    @XmlElement(name="Title")
    private String title;

    @XmlElement(name="Actor")
    private List<String> actor;

    @XmlElement(name="ProductGroup")
    private String productGroup;
}

ItemLink.java

@XmlAccessorType(XmlAccessType.FIELD)
public class ItemLink {
    @XmlElement(name="Description")
    private String description;

    @XmlElement(name="URL")
    private String url;
}

ItemLinks.java

@XmlAccessorType(XmlAccessType.FIELD)
public class ItemLinks {
    @XmlElement(name="ItemLink")
    List<ItemLink> itemLinks;
}

Upvotes: 12

Views: 39099

Answers (5)

Remove the namespace from package-info.java It's work for me

Ex:

@javax.xml.bind.annotation.XmlSchema(namespace = "", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

Upvotes: 0

Stack overflow user
Stack overflow user

Reputation: 23

Remove the namespace from package-info.java and change

elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED 

to

elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED.

Upvotes: 1

dmarwick
dmarwick

Reputation: 111

If you're using DocumentBuilderFactory in your getResponse method, try setting namespace awareness:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);

I had the same UnmarshalException and this solved it.

Upvotes: 3

hoaz
hoaz

Reputation: 10163

The explanation is here: The JAXBContext instance is intialized with class(es) passed as parameter(s) and classes that are statically reachable from these class(es).

Initialize JAXBContext using package, so it can see @XmlSchema declared in package-info.java:

JAXBContext.newInstance("com.services.amazon")

Upvotes: 4

bdoughan
bdoughan

Reputation: 149017

The error message is saying that you are getting an XML document that looks like this:

<ItemSearchResponse>

Instead of one like the following that matches the namespace qualification that you have mapped:

<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">

Upvotes: 6

Related Questions