2013-06-20 3 views
1

При попытке маршализации этого XML:Неожиданный элемент (uri: "", local: "element"). Ожидаемые элементы <{}link><{}size>

<holder> 
    <name>a</name> 
    <elements> 
    <element> 
     <name>elem</name> 
    </element> 
    </elements> 
</holder> 

я получаю ошибку unexpected element (uri:"", local:"element"). Expected elements are <{}link>,<{}totalSize> в ValidationEventHandler и теге <elements> (и, следовательно, elements поля в Holder классе) игнорируются.

При создании XML оба link и totalSize не выводятся, поскольку они равны нулю.

JAVA МОДЕЛЬ

Иерархия является немного сложным:

(упрощенный ради вопроса)

ElementRoot

абстрактные ElementRoot имеет соединительный элемент

public abstract class ElementRoot implements Serializable { 

    protected String link; 

    @XmlElement(name = "link") 
    public String getLink() { 
     return link; 
    } 

    public void setLink(String link) { 
     this.link = link; 
    } 

} 

Упаковочный

абстрактные Упаковочный расширяет ElementRoot и имеет элемент TotalSize

public abstract class Wrapper<T> extends ElementRoot { 

    protected int totalSize; 

    protected List<T> collection = new ArrayList<>(); 

    @XmlElement 
    public int getTotalSize() { 
     return totalSize; 
    } 

    public void setTotalSize(int totalSize) { 
     this.totalSize = totalSize; 
    } 

    public abstract List<T> getCollection(); 
} 

Держатель

Держатель простирается ElementRoot

@XmlRootElement(name = "holder") 
@XmlType(propOrder = {"name", "elements"}) 
public class Holder extends ElementRoot { 

    private String name; 

    private Elements elements; 

    // setters and getters not annotated 
} 

Элементы

Элементы расширяет обертку и имеет коллекцию Element

import java.util.Collection; 
import javax.xml.bind.annotation.*; 

@XmlRootElement(name = "elements) 
public class Elements extends Wrapper { 

    @Override 
    @XmlElement(name="element") 
    public Collection<Element> getElements() { 
     return elements; 
    } 

    // No setter, to add getElements().add(element) 
} 

Элемент

элемент простирается ElementRoot

@XmlRootElement(name = "element") 
@XmlType(propOrder = {"id", "name"}) 
public class Element extends ElementRoot { 

    private Integer id; 

    private String name; 

    // setters and getters no annotated 

} 

СРЕДЫ

Я использую java 7:

JAXB-api 2.2.7 
MOXy 2.5.0 
+2

Я добавил некоторые классы моделей на ваш вопрос, основываясь на вашем описании. Как у вас эти аннотации? Также где должен выглядеть элемент 'datastore' в вашем XML-вводе? –

+0

'datastore' осталось от оригинала, я упростил иерархию. Благодаря! – ssedano

ответ

1

Там, кажется, ошибка в EclipseLink JAXB (MOXy) для этого случая использования, связанные с абстрактным getCollecion собственности.Мы открыли следующую ошибку, которую вы можете использовать для отслеживания нашего прогресса в этом вопросе:

РАБОТА ВОКРУГ

Упаковочный

Мы может использовать @XmlAccessorType(XmlAccessType.NONE), так что только аннотированные поля/свойства (см.: http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html).

import java.util.*; 
import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.NONE) 
public abstract class Wrapper<T> extends ElementRoot { 

    protected int totalSize; 

    protected List<T> collection = new ArrayList<>(); 

    @XmlElement 
    public int getTotalSize() { 
     return totalSize; 
    } 

    public void setTotalSize(int totalSize) { 
     this.totalSize = totalSize; 
    } 

    public abstract List<T> getCollection(); 

} 

Элементы

С @XmlAccessorType наследуется подклассами уточним XmlAccessType.PUBLIC вернуть вещи в нормальное состояние. Примечание: Я предполагаю, что метод getElements() в вашем вопросе должен был быть getCollection().

import java.util.*; 
import javax.xml.bind.annotation.*; 

@XmlRootElement(name = "elements") 
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER) 
public class Elements extends Wrapper { 

    @Override 
    @XmlElement(name="element") 
    public List<Element> getCollection() { 
     return collection; 
    } 

    // No setter, to add getElements().add(element) 
} 
Смежные вопросы

 Смежные вопросы