2013-12-16 82 views
2

我有一個REST服務序列化到響應一些對象。 我的實體戰神註釋與XML,但JAXB提出了一個illegalAnnotationExceptions ...JAXB:註釋。異常提出

這裏的實體:

import java.util.List; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "icns") 
public class IcnList { 

    @XmlElement(required = true) 
    private List<IcnElement> icns; 

    public List<IcnElement> getIcns() { 
     return icns; 
    } 

    public void setIcns(List<IcnElement> icns) { 
     this.icns = icns; 
    } 

} 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "icn") 
public class IcnElement { 

    private String status; 

    private String revision; 

    private String icnName; 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public String getRevision() { 
     return revision; 
    } 

    public void setRevision(String revision) { 
     this.revision = revision; 
    } 

    public String getIcnName() { 
     return icnName; 
    } 

    public void setIcnName(String icnName) { 
     this.icnName = icnName; 
    } 

} 

這裏的例外:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
Class has two properties of the same name "icns" 
    this problem is related to the following location: 
     at public java.util.List com.xx.model.IcnList.getIcns() 
     at com.xx.model.IcnList 
    this problem is related to the following location: 
     at private java.util.List com.xx.model.IcnList.icns 
     at com.xx.model.IcnList 

誰能告訴我,我有什麼問題?爲什麼? 我做了一些研究,但我完全失去了......

謝謝。

回答

2

默認情況下,JAXB將把公共屬性和註釋字段。衝突是在映射發生,因爲JAXB認爲你有以下映射:

  1. 的字段稱爲映射到該元素icnsicns
  2. 一個名爲icns的屬性映射到元素icns

這會導致您的姓名發生衝突。您可以通過註解屬性(獲取或設置方法)消除衝突:

@XmlRootElement(name = "icns") 
public class IcnList { 

    private List<IcnElement> icns; 

    @XmlElement(required = true) 
    public List<IcnElement> getIcns() { 
     return icns; 
    } 

    public void setIcns(List<IcnElement> icns) { 
     this.icns = icns; 
    } 

} 

或者,如果你想註釋字段,你可以在類級別使用@XmlAccessorType(XmlAccessType.FIELD)

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

    @XmlElement(required = true) 
    private List<IcnElement> icns; 

    public List<IcnElement> getIcns() { 
     return icns; 
    } 

    public void setIcns(List<IcnElement> icns) { 
     this.icns = icns; 
    } 

} 

更多信息

+1

精彩的解釋。謝謝。 – MychaL

1

更改根元素

@XmlRootElement(name = "icns") 

,或者該元素的名稱:如映射

@XmlElement(required = true) 
private List<IcnElement> icns; 

使用@XmlType(name = "icn" ....)代替

+1

我已經試圖改變屬性的名稱,但沒有效果。 – MychaL

+1

您是否嘗試從IcnElement類中移除註釋?改用@XmlType(name =「icn」....)。 – adi