2013-12-16 84 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