2016-02-02 39 views
1

因此,我開始使用Jaxb創建我正在使用的程序的文件的XML副本。Jaxb編組點變量

在我的代碼實現後,我沒有問題,直到我最近添加了一個新的類到我的主類。

它可以很好地保存/加載該類是空白/未使用的,但是當試圖用某些數據Marshall該類時,我得到StackOverflowErrors。 (在一個場景中,將馬歇爾與所有沒有問題?)

錯誤消息

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
    at sun.reflect.Reflection.quickCheckMemberAccess(Reflection.java:84) 
    at java.lang.reflect.Field.get(Field.java:388) 
    at com.sun.xml.internal.bind.v2.runtime.reflect.Accessor$FieldReflection.get(Accessor.java:250) 
    at com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:118) 
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345) 
    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681) 
    at com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:143) 
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345) 
    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681) 
    at com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:143) 
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345) 
    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681) 

.xml文件輸出看起來正常,直到達到新的類我添加了這是哪裏它變壞了。

<positionPercentage> 
         <x>0</x> 
         <y>0</y> 
         <location> 
          <x>0</x> 
          <y>0</y> 
          <location> 
<x>0</x> 
<y>0</y> 
<location> 
    <x>0</x> 
    <y>0</y> 
    <location> 
     <x>0</x> 
     <y>0</y> 
     <location> 
      <x>0</x> 
      <y>0</y> 
      <location> 
       <x>0</x> 
       <y>0</y> 
       <location> 
        <x>0</x> 
        <y>0</y> 
        <location> 
         <x>0</x> 
         <y>0</y> 
         <location> 
          <x>0</x> 
          <y>0</y> 
          <location> 

通常,ws類的xml看起來像這樣。它包含一個Map<String, WidgetLink> WidgetLinks。這將一個鍵串映射到WidgetLinkWidgetLink類包含WidgetCode,Point positionPercentage和兩個字符串。問題的關鍵變量似乎是程序

<ws> 
     <widgetLinks> 
      <entry> 
       <key>Main-Comp Rack Fault `%rackname`</key> 
       <value> 
        <widgetCode> 
         <widgetName>LED-Circle-25x25</widgetName> 
         <variables> 
          <entry> 
           <key>`%XPOS%`</key> 
           <value></value> 
          </entry> 
          <entry> 
           <key>`%YPOS%`</key> 
           <value></value> 
          </entry> 
          <entry> 
           <key>`%IO_ID%`</key> 
           <value></value> 
          </entry> 
         </variables> 
         <fullWidgetText> ALOT OF CODE CUT OUT BUT IT PRINTS FINE</fullWidgetText> 
         <filePath>LED-Circle-25x25.txt</filePath> 
        </widgetCode> 
        <positionPercentage> 
         <x>0</x> 
         <y>0</y> 
        </positionPercentage> 
        <variableName>Comp Rack Fault `%rackname`</variableName> 
        <panelName>Main</panelName> 
       </widgetLinks> 
      </ws> 

的問題,我不知道該<location>項目是什麼,或者它來自哪裏?

我所有的課用@XmlAccessorType(XmlAccessType.FIELD)和我的主類Store使用代碼@XmlRootElement(name = "Store") @XmlAccessorType(XmlAccessType.FIELD)

是錯誤的東西做的Point變量?

編輯 - 我做了Point變量靜態,所以它不會被寫入XmlAccessType.FIELD的當前設置,它寫出罰款。我怎麼能Marshall點變量?

回答

2

行,所以我發現了一個網頁,解釋了爲什麼一個點變量會導致這些無限循環的錯誤 - >StackOverflowError

有時來處理不可映射類的最好方法是寫一個 「替身」級可以使用JAXB進行映射,並在XmlAdapter中的兩個類之間轉換 。在這個例子中,我們要使用 Point類。由於該類的getLocation()方法(JAXB 將自動拾取並映射),所以在編組期間會發生無限循環。因爲我們無法更改Point類,所以我們將編寫一個 新類MyPoint,並將其用於適配器中。 - 更多信息: http://www.eclipse.org/eclipselink/documentation/2.4/moxy/advanced_concepts006.htm#sthash.A8OXPKIV.dpuf