web-dev-qa-db-ja.com

javax.xml.bind.UnmarshalException:予期しない要素(uri: ""

XML応答をサービスからPOJOに変換しているときに例外が発生します。 XMLは次のようになります。

これが私の XML応答 です。

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

私はそれを次のように使用しています:

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

以下は私のファイルの詳細です

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;
}
8
Ethan

エラーメッセージは、次のようなXMLドキュメントを取得していることを示しています。

<ItemSearchResponse>

マップした名前空間の資格に一致する次のようなものの代わりに:

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

説明は ここ :JAXBContextインスタンスは、パラメーターとして渡されたクラスと、これらのクラスから静的に到達可能なクラスで初期化されます。

Packageを使用してJAXBContextを初期化し、package-info.Javaで宣言された@XmlSchemaを確認できるようにします。

JAXBContext.newInstance("com.services.Amazon")
4
hoaz

GetResponseメソッドでDocumentBuilderFactoryを使用している場合は、名前空間の認識を設定してみてください。

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

私は同じUnmarshalExceptionを持っていました、そしてこれはそれを解決しました。

2
dmarwick

package-info.Javaから名前空間を削除し、変更します

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

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

Package-info.Javaから名前空間を削除しますそれは私のために働きます

例:

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