Дублированное поле в сгенерированном XML с использованием JAXB

Вот мой сценарий. У меня есть общий класс:

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 getList() с List getList() - это избежание раздражающих генерируемых 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, я предпочитаю использовать более независимый от реализации подход.

Заранее спасибо за любые отзывы!

8
задан Sergio 22 October 2011 в 14:42
поделиться