2013-06-18 26 views
5

Używam Eclipselink 2.3.2 jako mojego dostawcę JAXB (JSR-222). Utworzono ogólną listę, która składa się z listy elementów i zestawu łączy paginacji.Problem z Eclipselink i @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() { 
    } 

} 

Mój rzeczywisty Podmiot

@XmlRootElement(name="authorization") 
public class AuthorizationDTO { 

    @XmlElement 
    public String referenceNumber; 

} 

Tak, po utworzeniu listy, gdy próbuję Marshall, ja otrzymuję następujący błąd. Współpracuje z @XmlElement dla danych listy, ale oczywiście nie może być stosowany jako tworzy reprezentację obiektu

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. 

Odpowiedz

3

@XmlElementRef adnotacja ma następujące wymagania (patrz: http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/annotation/XmlElementRef.html):

  • Jeśli kolekcja typ elementu (dla właściwości kolekcji) lub typ właściwości (dla właściwości o pojedynczej wartości) to JAXBElement, następnie @XmlElementRef.name() i @XmlElementRef.namespace() muszą wskazywać metodę fabryki elementów z adnotacją @XmlElementDecl w klasie z adnotacją @XmlRegistry (zwykle ObjectFactory klasa generowane przez kompilator schematu):

    • @XmlElementDecl.name() musi równać @XmlElementRef.name()
    • @XmlElementDecl.namespace() musi równać @XmlElementRef.namespace().
  • Jeżeli typ elementu kolekcji (nieruchomości kolekcji) lub typu nieruchomości (dla pojedynczego ceniony nieruchomości) nie jest JAXBElement, następnie rodzaj określany przez obiekt lub pola muszą być opatrzone @XmlRootElement.


Od ListEntity będą przetwarzane jako klasa, a nie typ pola data będą traktowane jako posiadające typ Object i dlatego wymagania dotyczące @XmlElementRef nie zostały spełnione, co skutkuje tym że cię widzą.