2011-07-20 199 views
82

與JAXB,我嘗試讀取XML文件 只有在XML文件中的一些元素是有趣的,所以我想跳過許多元素JAXB,類具有相同名稱的兩個屬性

xml content

XML我嘗試閱讀

<?xml version="1.0" encoding="UTF-8"?> 
<!--Sample XML file generated by XMLSpy v2010 rel. 3 sp1 (http://www.altova.com)--> 
<flx:ModeleREP xsi:schemaLocation="urn:test:mod_rep.xsd mod_rep.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:flx="urn:test:mod_rep.xsd"> 
<flx:DocumentHeader> 
    <flx:Identification v="04489"/> 
</flx:DocumentHeader> 
<flx:TimeSeries> 
    <flx:Identification v="test1a"/> 
    <flx:BusinessType v="A01"/> 
    <flx:Product v="123a"/> 
    <flx:ResourceObject codingScheme="N" v="testa"/> 
    <flx:Period> 
     <flx:TimeInterval v="2011-07-02T00:00/2011-07-16T00:00"/> 
     <flx:Resolution v="PT2H"/> 
     <flx:Pt> 
      <flx:P v="1"/> 
      <flx:Q unitCode="String" v="1.0"/> 
      <flx:A currencyIdentifier="String" v="195.0"/> 
     </flx:Pt> 
    </flx:Period> 
</flx:TimeSeries> 
<flx:TimeSeries> 
    <flx:Identification v="test2a"/> 
    <flx:BusinessType v="A01"/> 
    <flx:Product v="a123b"/> 
    <flx:ResourceObject codingScheme="N" v="test2"/> 
    <flx:Period> 
     <flx:TimeInterval v="2011-07-02T00:00/2011-07-16T00:00"/> 
     <flx:Resolution v="PT2H"/> 
     <flx:Pt> 
      <flx:P v="1"/> 
      <flx:Q unitCode="String" v="1.0"/> 
      <flx:A currencyIdentifier="String" v="195.0"/> 
     </flx:Pt> 
     <flx:Pt> 
      <flx:P v="2"/> 
      <flx:Q unitCode="String" v="1.0"/> 
      <flx:A currencyIdentifier="String" v="195.0"/> 
     </flx:Pt> 
    </flx:Period> 
</flx:TimeSeries> 
</flx:ModeleREP> 

我的課

@XmlRootElement(name="ModeleREP", namespace="urn:test:mod_rep.xsd") 
public class ModeleREP { 

    @XmlElement(name="TimeSeries") 
    protected List<TimeSeries> timeSeries; 

    public List<TimeSeries> getTimeSeries() { 
    if (this.timeSeries == null) { 
     this.timeSeries = new ArrayList<TimeSeries>(); 
    } 
    return this.timeSeries; 
    } 

    public void setTimeSeries(List<TimeSeries> timeSeries) { 
    this.timeSeries = timeSeries; 
    } 

} 

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

@XmlElement(name="ResourceObject") 
protected RessourceObject resourceObject; 

@XmlElement(name = "Period") 
protected Period period; 

public RessourceObject getResourceObject() { 
    return this.resourceObject; 
} 

public void setResourceObject(RessourceObject resourceObject) { 
    this.resourceObject = resourceObject; 
} 

public Period getPeriod() { 
    return this.period; 
} 

public void setPeriod(Period period) { 
    this.period = period; 
} 

} 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "ResourceObject") 

public class RessourceObject { 
@XmlAttribute(name = "codingScheme") 
protected String codingScheme; 

@XmlAttribute(name = "v") 
protected String v; 

public String getCodingScheme() { 
    return this.codingScheme; 
} 

public void setCodingScheme(String codingScheme) { 
    this.codingScheme = codingScheme; 
} 

public String getV() { 
    return this.v; 
} 

public void setV(String v) { 
    this.v = v; 
} 
} 

@XmlAccessorType(XmlAccessType.NONE) 
@XmlRootElement(name = "Period") 
public class Period { 

@XmlElement(name = "TimeInterval") 
protected TimeInterval timeInterval; 

@XmlElement(name = "Pt") 
protected List<Pt> pt; 

public TimeInterval getTimeInterval() { 
    return this.timeInterval; 
} 

public void setTimeInterval(TimeInterval timeInterval) { 
    this.timeInterval = timeInterval; 
} 

public List<Pt> getPt() { 
    if (this.pt == null) { 
    this.pt = new ArrayList<Pt>(); 
    } 
    return this.pt; 
} 

public void setPt(List<Pt> pt) { 
    this.pt=pt; 
} 

} 

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

@XmlAttribute(name = "v") 
private String timeIntervalPeriod; 

public String getTimeIntervalPeriod() { 
    return this.timeIntervalPeriod; 
} 

public void setTimeIntervalPeriod(String timeIntervalPeriod) { 
    this.timeIntervalPeriod = timeIntervalPeriod; 
} 

} 

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

@XmlElement(name = "P") 
protected P p; 

@XmlElement(name = "A") 
protected A a; 

public P getP() { 
    return this.p; 
} 

public void setP(P p) { 
    this.p = p; 
} 

public A getA() { 
    return this.a; 
} 

public void setA(A a) { 
    this.a = a; 
} 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "P") 
public class P { 
@XmlAttribute(name = "v") 
protected String position; 


public String getPosition(){ 
    return this.position; 
} 

public void setPosition(String position){ 
    this.position=position; 
} 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "A") 
public class A { 
@XmlAttribute(name = "v") 
protected String calculatedAmount; 

public String getCalculatedAmount() { 
    return this.calculatedAmount; 
} 

public void setCalculatedAmount(String calculatedAmount) { 
    this.calculatedAmount = calculatedAmount; 
} 
} 

當我嘗試讀取XLM文件我得到 我得到

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
Class has two properties of the same name "timeSeries" 
    this problem is related to the following location: 
     at public java.util.List testjaxp.ModeleREP.getTimeSeries() 
     at testjaxp.ModeleREP 
    this problem is related to the following location: 
     at protected java.util.List testjaxp.ModeleREP.timeSeries 
     at testjaxp.ModeleREP 

我不明白這個錯誤

編輯:我現在用的JAXB IMPL-2.1.12

確定我沒有任何錯誤,但是當我檢查我的對象時,timeSeries爲空...

所以也許jaxb似乎有flx的問題?

回答

10

您的JAXB正在查看getTimeSeries()方法和成員timeSeries。你沒有說你正在使用哪個JAXB實現,或者它的配置,但是這個例外很明顯。

在公衆的java.util.List testjaxp.ModeleREP.getTimeSeries()

在受保護的java.util.List testjaxp.ModeleREP.timeSeries

您需要配置您使用註釋的JAXB內容(根據您的@XmlElement(name="TimeSeries"))並忽略公共方法。

+0

我已經這樣做了:@XmlElement(NAME = 「TimeSeries」) 受保護列表 timeSeries; – redfox26

+3

另外我更改(XmlAccessType.FIELD)爲(XmlAccessType.NONE),我可以保留XmlElement在成員級別 – redfox26

+0

感謝您的正確解釋;) –

19

您沒有指定您使用的是什麼JAXB-IMPL版本,但是一旦我遇到同樣的問題(使用jaxb-impl 2.0.5),並在getter級別使用註釋解決它,而不是在成員級別。

+0

這是正確的我剛剛刪除成員的註釋並將其放在setter級別和它工作。 – Varun

3

這些是JAXB正在研究的兩個屬性。

public java.util.List testjaxp.ModeleREP.getTimeSeries() 

protected java.util.List testjaxp.ModeleREP.timeSeries 

這可以通過使用JAXB標註在仿如下面提到get方法來避免。

@XmlElement(name="TimeSeries")) 
public java.util.List testjaxp.ModeleREP.getTimeSeries() 
7

您需要配置ModeleREP類以及與@XmlAccessorType(XmlAccessType.FIELD)爲您TimeSeries類一樣。

有無人看OOXS

145

我也面臨類似問題,這一點,我設置。

@XmlRootElement(name="yourRootElementName") 
@XmlAccessorType(XmlAccessType.FIELD) 

這將工作100%

+4

我有同樣的問題。甚至當我們僅添加@XmlAccessorType(XmlAccessType.FIELD)時,它也能正常工作 –

+2

我通過_removing_'@XmlAccessorType(XmlAccessType.FIELD)'註釋解決了這個問題 –

+0

聽起來很奇怪,但我也通過減少註釋對 \ @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) 僅限於 \ @XmlRootElement –

2

我剛剛碰到這個問題,並解決它。

問題的根源在於你有XmlAccessType.FIELD和getters和setter對。解決方案是刪除setter並添加一個默認的構造函數和一個構造函數,該構造函數接受所有字段。

+0

我有同樣的錯誤,你提到的註釋解決了它,謝謝! – gyorgyabraham

12

我也看到過一些類似的問題。

我認爲,這是因爲地方的,我們用「@XmlElement註釋在(豆)類。

我認爲,該JAXB(註釋處理器)認爲相同的字段元素作爲不同性質的成員字段&吸氣劑的方法,當我們使用@XmlElement註釋在字段水平和投IllegalAnnotationExceptions異常。

異常消息:

類具有兩個屬性的相同 「時間序列」

在getter方法的

at public java.util.List testjaxp.ModeleREP.getTimeSeries() 

在成員字段:

at protected java.util.List testjaxp.ModeleREP.timeSeries 

解決方案:領域使用@XmlElement相反,在吸氣方法使用它。

0

@XmlTransient註解解決這個問題

@XmlTransient 
public void setTimeSeries(List<TimeSeries> timeSeries) { 
    this.timeSeries = timeSeries; 
} 

http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html更多細節

+1

我認爲這比解決方案更具破壞性。這告訴jaxb忽略該方法,而不是讓它知道它是同一件事。 –

+0

黑客或不是這是最好的解決方案來解決一些不能被描述爲缺少bug的東西,我使用了@XmlAccessorType(XmlAccessType.FIELD),它被忽略了,並且爲每個屬性添加@XmlTransient是唯一的方法來修復這個問題。謝謝! –

2

我面臨同樣的問題,我補充

@XmlRootElement(name="yourRootElementName") 

@XmlAccessorType(XmlAccessType.FIELD) 

,現在它的工作。。

1

我有簽名服務類,如下」

@WebMethod 
public FetchIQAStatusResponseVO fetchIQAStatus(FetchIQAStatusRequest fetchIQAStatusRequest) { 

上運行我得到了同樣的錯誤FetchIQAStatusResponseVO領域我剛纔添加的FetchIQAStatusResponseVO在上面的一行:

@XmlAccessorType(XmlAccessType.FIELD) //This line added 
public class FetchIQAStatusResponseVO { 

和這解決了這個問題

7

如果我們使用下面的註釋並刪除「@XmlElement」註釋,代碼應該可以正常工作,並且生成的XML會有e類似於班級成員的名字。

@XmlRootElement(name="<RootElementName>") 
@XmlAccessorType(XmlAccessType.FIELD) 

如果確實需要使用「@XmlElement」,請將其定義爲字段級別,代碼應該完美工作。不要在getter方法的頂部定義註釋。

已經嘗試了上述方法,並得到解決這個問題。

4

只需在要轉換爲XML的類中聲明成員變量爲private即可。 快樂編碼

+1

這實際上解決了我的問題 –

+0

這應該是公認的解決方案。如果你聲明你的成員變量是公開的,除了getter/setter帶註釋的方法外,JABX將解析它並吐出異常。 這是一個很好的例子,jabx圖書館設計師在反思中進一步努力創造靈活性並最終導致無效配置。我自己修改了一行代碼,然後回溯到成員變量,從而解決了問題。 – Vortex

0

一個快速和簡單的方式來解決這個問題是從變量聲明語句protected List<TimeSeries> timeSeries;的頂部去除@XmlElement(name="TimeSeries")其吸氣劑,public List<TimeSeries> getTimeSeries()的頂部。

因此您ModeleREP類看起來像:

@XmlRootElement(name="ModeleREP", namespace="urn:test:mod_rep.xsd") 
public class ModeleREP { 


    protected List<TimeSeries> timeSeries; 

    @XmlElement(name="TimeSeries") 
    public List<TimeSeries> getTimeSeries() { 
    if (this.timeSeries == null) { 
     this.timeSeries = new ArrayList<TimeSeries>(); 
    } 
    return this.timeSeries; 
    } 

    public void setTimeSeries(List<TimeSeries> timeSeries) { 
    this.timeSeries = timeSeries; 
    } 
} 

希望它能幫助!

2

「類具有相同的名稱異常兩個屬性」當你有一個公共的訪問級別,併爲同一部件的getter/setter類成員x可能發生。作爲一個java的經驗法則,不建議使用訪問級別與getter和setter一起使用public

檢查此瞭解更多詳情: Public property VS Private property with getter?

爲了解決這個問題:

  1. 更改您的會員訪問級別私人,並保持你的getter/setter
  2. 刪除成員的getter和setter
4

剛剛添加到我的課

@XmlAccessorType(XmlAccessType.FIELD) 

工作就像一個湛

0

它會在你的干將之前把你的註釋工作,並從受保護的屬性中刪除:

protected String codingScheme; 

@XmlAttribute(name = "codingScheme") 
public String getCodingScheme() { 
    return this.codingScheme; 
} 
相關問題