Вот мой сценарий. У меня есть общий класс:
public class Tuple extends ArrayList {
//...
public Tuple(T ...members) {
this(Arrays.asList(members));
}
@XmlElementWrapper(name = "tuple")
@XmlElement(name = "value")
public List getList() {
return this;
}
}
И дочерний класс:
public class StringTuple extends Tuple {
public StringTuple(String ...members) {
super(members);
}
//explanation of why overriding this method soon ...
@XmlElementWrapper(name = "tuple")
@XmlElement(name = "value")
@Override
public List getList() {
return this;
}
}
На эти классы ссылаются здесь:
@XmlRootElement(namespace = "iv4e.xml.jaxb.model")
public class Relation {
private Tuple relationVars;
//...
@XmlElementWrapper(name = "allRelationVars")
@XmlElement(name = "relationVarsList")
public Tuple getRelationVars() {
return relationVars;
}
}
Затем создается объект Relation с чем-то вроде:
Relation rel = new Relation();
rel.setRelationVars(new Tuple(
new StringTuple("RelationshipVar1"), new StringTuple("RelationshipVar2")));
После маршаллинга этого объекта Xml-вывод выглядит так:
RelationshipVar1
RelationshipVar1
RelationshipVar2
RelationshipVar2
Таким образом, элементы value
дублируются!
Теперь, причина, по которой класс StringTuple переопределяет List
с List
- это избежание раздражающих генерируемых xmlns:xs
атрибутов в каждом члене списка (value
элементы в xml документе).
Но тогда каждый член списка отображается в выводе дважды. Видимо, это происходит потому, что и переопределенный родительский метод, и дочерний метод аннотированы @XmlElement
.
Поэтому мой главный вопрос: есть ли способ игнорировать переопределенные методы, аннотированные @XmlElement
в Jaxb? (учитывая, что переопределяемый метод также аннотирован @XmlElement
)
Я нашел старое сообщение с похожей проблемой: http://old.nabble.com/@XmlElement-on-overridden-methods-td19101616.html, но пока не нашел никакого решения.
Также замечу, что добавление аннотации @XmlTransient
к методу getList
в родительском классе (Tuple
) может решить эту проблему, но породит другие, поскольку родительский класс не является абстрактным и используется один в других контекстах.
Один побочный вторичный вопрос: возможно ли объявить атрибут xmlns:xs
в корневом узле вместо того, чтобы он - раздражающе - появлялся в каждом узле, где он необходим? Я знаю, что это можно сделать с помощью класса NamespacePrefixMapper
, но поскольку это нестандартный, внутренний класс SUN, я предпочитаю использовать более независимый от реализации подход.
Заранее спасибо за любые отзывы!