我有一个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
有人可以告诉我这是什么问题吗?为什么? 我做了一些研究,但我完全失去了......
谢谢。
答案 0 :(得分:2)
默认情况下,JAXB会将公共属性和带注释的字段视为已映射。冲突发生在您的映射中,因为JAXB认为您有以下映射:
icns
的字段,映射到元素icns
。icns
的属性,映射到元素icns
。这导致您的名字冲突。您可以通过注释属性(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" ....)
代替