我正在使用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;

}

因此,创建列表后,当我尝试将其编码时,出现以下错误。与@XmlElement一起用于List数据可以正常工作,但是显然不能使用,因为它创建了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.

最佳答案

@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,则属性或字段引用的类型必须用@XmlRootElement注释。


  • 由于ListEntity将作为类而不是类型处理,因此data字段将被视为具有Object类型,因此对@XmlElementRef的要求将无法满足,从而导致您所看到的异常。

    10-06 06:19