JAXB:注释。提出例外

时间:2013-12-16 10:13:02

标签: java xml rest jaxb

我有一个REST服务,它将一些对象序列化到响应中。 我的实体用XML注释,但JAXB引发了一个illegalAnnotationExceptions ...

这里是实体:

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 个答案:

答案 0 :(得分:2)

默认情况下,JAXB会将公共属性和带注释的字段视为已映射。冲突发生在您的映射中,因为JAXB认为您有以下映射:

  1. 一个名为icns的字段,映射到元素icns
  2. 一个名为icns的属性,映射到元素icns
  3. 这导致您的名字冲突。您可以通过注释属性(get或set方法)消除冲突:

    @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 :(得分:1)

更改根元素的名称

@XmlRootElement(name = "icns")

或,这个元素:

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

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