2012-09-06 1783 views
5

嘗試使用JAXBjavax.xml.bind.UnmarshalException:意外的元素(URI:

 javax.xml.bind.UnmarshalException: unexpected element (uri:"http://SOMETHING/doc/2006-03-01/", local:"Name"). Expected elements are <{}Name>,<{}IsTruncated>,<{}MaxKeys>,<{}Contents>,<{}Prefix>,<{}Marker> 

這裏來轉換XML響應的Java對象時,我收到以下錯誤是我的XML:

 <ListBucketResult xmlns="http://something/doc/2006-03-01/"> 
      <Name>test2</Name> 
      <Prefix/> 
      <Marker/> 
      <MaxKeys>3</MaxKeys> 
      <IsTruncated>false</IsTruncated> 
      <Contents> 
        <Key>metadata.xml</Key> 
        <LastModified>2012-09-04T08:29:36.000Z</LastModified> 
        <ETag>6b836fd43c402681506926b2248ec418</ETag> 
        <Size>3258</Size> 
        <StorageClass>STANDARD</StorageClass> 
      </Contents> 
      </ListBucketResult> 

我的Java對象類是像這樣

  @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
     "name", 
     "prefix", 
     "marker", 
     "maxKeys", 
     "isTruncated", 
     "contents" 
    }) 
    @XmlRootElement(name = "ListBucketResult") 
    public class ListBucketResult { 

@XmlElement(name = "Name", required = true) 
protected String name; 
@XmlElement(name = "Prefix", required = true) 
protected String prefix; 
@XmlElement(name = "Marker", required = true) 
protected String marker; 
@XmlElement(name = "MaxKeys") 
protected int maxKeys; 
@XmlElement(name = "IsTruncated") 
protected boolean isTruncated; 
@XmlElement(name = "Contents", required = true) 
protected ListBucketResult.Contents contents; 







     @XmlAccessorType(XmlAccessType.FIELD) 
     @XmlType(name = "", propOrder = { 
       "key", 
       "lastModified", 
        "eTag", 
        "size", 
       "storageClass" 
      }) 
      public static class Contents { 

    @XmlElement(name = "Key", required = true) 
    protected String key; 
    @XmlElement(name = "LastModified", required = true) 
    @XmlSchemaType(name = "dateTime") 
    protected XMLGregorianCalendar lastModified; 
    @XmlElement(name = "ETag", required = true) 
    protected String eTag; 
    @XmlElement(name = "Size") 
    protected int size; 
    @XmlElement(name = "StorageClass", required = true) 
    protected String storageClass; 

,最後我的解組代碼爲:

      JAXBContext jc = JAXBContext.newInstance(ListBucketResult.class); 
      Unmarshaller unmarshaller = jc.createUnmarshaller(); 
      unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler()); 
       JAXBElement element = (JAXBElement) unmarshaller.unmarshal (inputStream); 
      ListBucketResult customer = (ListBucketResult) element.getValue(); 

有人請讓我知道我在做什麼不正確嗎?

回答

3

XML文檔包含的元素是'http:// something/doc/2006-03-01 /'命名空間的一部分,但註釋的java類不與該命名空間相關聯。嘗試改變@XmlType註釋:

@XmlType(name = "", namespace="http://something/doc/2006-03-01/", propOrder = { ... 
+0

嗨,改變這沒有幫助。 \t @XmlAccessorType(XmlAccessType。FIELD) \t \t @XmlType(名稱= 「」,命名空間= 「HTTP://東西/ DOC/2006-03-01 /」,propOrder = { \t \t 「姓名」, \t \t 「前綴」, \t \t 「標記」, \t \t 「maxKeys」, \t \t 「isTruncated」, \t \t 「內容」 \t \t}) – Yahiya

+1

任何任何人的幫助? – Yahiya

+1

無論機制如何,問題都是一個命名空間問題。異常方法表示提供了一個完全限定名爲{http:// SOMETHING/doc/2006-03-01 /} Name的元素(根據提供的xml正確),但元素{}預計名稱(除其他外)。後者是默認名稱空間中的一個元素。異常*現在是完全相同還是稍有變化? – dcbyers

5

您可以使用@XmlSchema註釋上package-info類控制的命名空間的資格。如果您已經編寫了package-info類,請確保它正在編譯中(某些版本的ant與package-info類有問題)。

包信息

@XmlSchema( 
    namespace = "http://something/doc/2006-03-01/", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package example; 

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

更多信息

0

我得到類似的錯誤org.codehaus.jackson.JsonParseExceptionjavax.xml.bind.UnmarshalException:帶有鏈接的異常:[javax.xml.bind.UnmarshalException:意外的元素(uri:「sometext」,local:「elementA」)。預期的元素是

這是整合的RESTEasy我的DTO的使用生成的JAXB 。我正在使用傑克遜進行轉換。

爲了解決這個問題,我在Maven依賴項中引入了Jackson庫,它解決了我的問題。傑克遜依賴特定於這

<dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-xc</artifactId> 
     <version>1.9.9</version> 
    </dependency> 

還有其他的傑克遜罐子,以及我需要的,所以我的POM本質上看如下。

//The jackson-core-asl jar contains streaming JSON parser and generator interfaces and implementations 
<dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.9.9</version> 
    </dependency> 
//Ability to use JAXB annotations containing classes needed to add XML compatibility support. 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-xc</artifactId> 
     <version>1.9.9</version> 
    </dependency> 
    //Mapper jar contains functionality for data binding: 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.9</version> 
    </dependency> //This dependency makes a JAX-RS implementation like Jersey,RESTEasy use Jackson for binding of JSON to-from Java objects 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-jaxrs</artifactId> 
     <version>1.9.9</version> 
    </dependency> 
相關問題