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;
}
エラーメッセージは、次のようなXMLドキュメントを取得していることを示しています。
<ItemSearchResponse>
マップした名前空間の資格に一致する次のようなものの代わりに:
<ItemSearchResponse xmlns="http://webservices.Amazon.com/AWSECommerceService/2011-08-01">
説明は ここ :JAXBContextインスタンスは、パラメーターとして渡されたクラスと、これらのクラスから静的に到達可能なクラスで初期化されます。
Packageを使用してJAXBContext
を初期化し、package-info.Javaで宣言された@XmlSchema
を確認できるようにします。
JAXBContext.newInstance("com.services.Amazon")
GetResponseメソッドでDocumentBuilderFactoryを使用している場合は、名前空間の認識を設定してみてください。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
私は同じUnmarshalExceptionを持っていました、そしてこれはそれを解決しました。
package-info.Java
から名前空間を削除し、変更します
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
に
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED.
Package-info.Javaから名前空間を削除しますそれは私のために働きます
例:
@ javax.xml.bind.annotation.XmlSchema(namespace = ""、elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)