2016-01-18 110 views
1

我有像以下JAXB解組單本原元素

<tag1> 
    <intag1> 
     <item> 
      <aaa>sdfdfsf</aaa> 
      <bbb>fvdfv</bbb> 
     </item> 
    </intag1> 
    <intag2>3</intag2> 
</tag1> 

我使用彈簧料與JAXB讀取xml並映射到對象的XML文件。我有一個對象模型intag1,它沒有任何問題映射,但我想直接將intag2映射到int對象。以下是我一直在測試的示例代碼,但這給我以下例外。任何人都可以指出這個問題嗎?

Jaxb2Marshaller jaxb2unmarshaller = new Jaxb2Marshaller(); 
jaxb2unmarshaller.setClassesToBeBound(int.class); 
jaxb2unmarshaller.afterPropertiesSet(); 

StaxEventItemReader reader = new StaxEventItemReader(); 

reader.setResource(new InputStreamResource(new FileInputStream("test6.xml"))); 
reader.setUnmarshaller(jaxb2unmarshaller); 
reader.setFragmentRootElementName("intag2"); 
reader.afterPropertiesSet(); 
reader.open(new ExecutionContext()); 

例外:

[com.sun.istack.internal.SAXParseException2; lineNumber: 105; columnNumber: 25; unexpected element (uri:"", local:"intag2"). Expected elements are (none)] 

回答

1

這是由於對類intjava.lang.Integer缺乏javax.xml.bind.annotation

編輯(刪除舊的解決方案)

我設法只<intag2>做這個地圖:

讀者:

<batch:reader> 
    <bean class="org.springframework.batch.item.xml.StaxEventItemReader"> 
     <property name="fragmentRootElementName" value="intag2" /> 
     <property name="resource" value="file:config/steps/test6.xml" /> 
     <property name="unmarshaller"> 
      <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
        <property name="classesToBeBound"> 
         <list> 
          <value>Intag2</value> 
         </list> 
        </property> 
      </bean> 
     </property> 
    </bean> 
</batch:reader> 

映射類:

@XmlRootElement(name = "intag2") 
public class Intag2 { 

    private Integer intag2; 

    @XmlElement(name = "intag2") 
    public Integer getIntag2() { 
     return intag2; 
    } 

    public void setIntag2(Integer intag2) { 
     this.intag2 = intag2; 
    } 
} 

它看起來像根元素c一個也是一個簡單的元素來讀取在同一時間。

+0

我已經有了映射'intag1'和'intag1'的模型類可以重複1000次以上,這就是爲什麼我使用流式傳輸。我不想將根級'tag1'元素映射到java對象,因爲它需要更多的內存。 – Sudheera

+0

@Sudheera我更新了我的答案以符合您的需求 – Thrax

+0

您好@Thrax謝謝,我剛剛發佈了另一個答案,只是快速瀏覽一下。 – Sudheera

1

嗨,大家好,我發現了這樣做的方式,並在這裏張貼爲其他人的答案。

我們需要創建一個帶註釋RootElement的模型類,如下所示,並且應該給@XmlValue標記以指示該元素的值應該映射到整數字段。就是這樣

@XmlRootElement(name = "intag2") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class IV_TRAILER { 

    @XmlValue 
    private int value; 

    public int getValue() { 
     return value; 
    } 

    public void setValue(int value) { 
     this.value = value; 
    } 
}