2013-03-06 4 views
1

У меня есть класс (ChildClass), который расширяет ParentClass. Когда unmarshalling, я получаю исключение из setPropFromElementList(), что значение, которое я передаю, не существует в списке, даже если оно существует в списке. Я считаю, что проблема вызвана тем, что JAXB пытается установить атрибут родителя перед установкой элементов дочернего элемента.Есть ли способ обеспечить, чтобы мои элементы jaxb были установлены перед атрибутами при использовании наследования?

Я видел различные сообщения в блоге и вопросы, которые предполагали создание родительского класса Transient, а затем использование propOrder в дочернем классе (включая элементы из родительского класса). Это не помогло мне - я получил исключение IllegalAnnotationException.

Любые идеи? (Пример кода ниже - это не код точный, что я использовал, так что я не 100% уверен, что он будет компилировать Это, однако, показать, что я сделал в моем реальном коде.).

ParentClass. Java

@XmlTransient //on the entire class - not shown here 

private String propFromElementList 

@XmlAttribute 
String getPropFromElementList() { 
    return this.propFromElementList; 
} 

void setPropFromElementList(String value) { 
    checkThatValueIsInList(value); 
    this.propFromElementList = value; 
} 

protected abstract void checkThatValueIsInList(String value); 

ChildClass.java расширяет ParentClass

@XmlType (propOrder = { "список", "propFromElementList"})

private String[] list; 

@XmlElement 
public String[] getList() { 
    return this.list; 
} 

public void setList(final String... list) { 
    this.list = list; 
} 

@Override 
protected void checkThatValueIsInList(String value) { 
    //search for String and throw RuntimeException if not found 
} 

XML

<child propFromElementList="A"> 
    <list>A B C D</list> 
</child> 

ответ

0

UPDATE

Есть ли способ, чтобы убедиться, что мои JAXB элементы устанавливаются перед атрибутами при использовании наследования?

Вы не можете управлять порядком, в котором реализация JAXB (JSR-222) заполняет модель домена. JAXB impl больше всего будет заполнять объектную модель, поскольку она выполняет глубину первого обхода XML-документа во время операции unmarshal. Это означает, что атрибуты обычно обрабатываются перед любыми дочерними элементами, которые, как представляется, вызывают проблемы в вашем случае использования.

Возможно, вы захотите переместить логику проверки вне метода setPropFromElementList и поместить его в метод afterUnmarshal.


оригинальный ответ

propOrder установка на @XmlType используется только при сортировочных. Вы не можете включать свойства, сопоставленные с @XmlAttribute, в propOrder по адресу @XmlType. Поскольку у вас есть:

@XmlAttribute 
String getPropFromElementList() { 
    return this.propFromElementList; 
} 

Тогда propFromElementList не может появиться в propOrder который предназначен только для узлов, не атрибутов.

+0

так есть ли способ убедиться, что элементы установлены перед атрибутами? – chama

+0

@chama - Я обновил свой ответ. –

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