2013-06-18 46 views
5

我使用Eclipselink 2.3.2作为我的JAXB (JSR-222)供应商。我创建了一个通用列表,其中包含项目列表和一组分页链接。问题与Eclipselink和@XmlRef

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的清单数据,但很明显,因为它创造对象表示

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. 

回答

3

@XmlElementRef注解有如下要求不能使用(参见:http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/annotation/XmlElementRef.html):

  • 如果集合项目类型(对于收集属性)或属性类型(对于单值属性)为JAXBElement,那么@XmlElementRef.name()@XmlElementRef.namespace()必须在带有注释的类中指定具有@XmlElementDecl批注的元素工厂方法(由模式编译器生成通常ObjectFactory类):

    • @XmlElementDecl.name()必须等于@XmlElementRef.name()
    • @XmlElementDecl.namespace()必须等于@XmlElementRef.namespace()
  • 如果集合项目类型(集合属性)或属性类型(用于单个赋值属性)不是JAXBElement,然后由属性或字段引用的类型必须与@XmlRootElement注释。


由于ListEntity将被处理为一类,而不是一种类型的data字段将被视为具有类型Object并因此为@XmlElementRef要求将不会已经满足导致例外您正在看。