我正在使用Eclipselink 2.3.2作为我的JAXB (JSR-222)提供商。我创建了一个通用列表,其中包含一个项目列表和一组分页链接。
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "listdata")
public class ListEntity<T> {
@XmlElementRef
public List<T> data;
@XmlElementRef
public PaginationLinks links;
public ListEntity(List<T> data) {
this.data = data;
}
public ListEntity() {
}
}
我的实际实体
@XmlRootElement(name="authorization")
public class AuthorizationDTO {
@XmlElement
public String referenceNumber;
}
因此,在创建列表后,当我尝试编组时,我收到以下错误。适用于List数据的@XmlElement可以正常工作,但显然无法使用它,因为它创建了Object表示
Caused by: Exception [EclipseLink-50006] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.JAXBException
Exception Description: Invalid XmlElementRef on property data on class com.ofss.fc.botg.infra.model.ListEntity. Referenced Element not declared.
答案 0 :(得分:3)
@XmlElementRef
注释具有以下要求(请参阅:http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/annotation/XmlElementRef.html):
如果集合项类型(对于集合属性)或属性类型(对于单值属性)是JAXBElement
,那么@XmlElementRef.name()
和@XmlElementRef.namespace()
必须指向在带有@XmlElementDecl
注释的类中带有@XmlRegistry
注释的元素工厂方法(通常由架构编译器生成ObjectFactory
类):
@XmlElementDecl.name()
必须等于@XmlElementRef.name()
@XmlElementDecl.namespace()
必须等于@XmlElementRef.namespace()
。 如果集合项类型(对于集合属性)或属性类型(对于单值属性)不是JAXBElement
,则属性或字段引用的类型必须使用{注释{1}}。
由于@XmlRootElement
将被处理为一个类而不是一个类型,ListEntity
字段将被视为具有data
类型,因此Object
的要求将不会已经满足,导致您看到异常。