JAXB: Как я могу маршировать использование имени поля, когда тип возврата является интерфейсом?

Если у меня есть класс (A), который содержит несколько свойств одного и того же типа (интерфейс B).

Я использовал предложение в http://jaxb.java.net/guide/Mapping_interfaces.html, чтобы использовать комбинацию @XmlRootElement и @XmlAnyElement, чтобы обойти проблему интерфейса:

public interface B {...}

public class A {
...
 @XmlAnyElement
 public B getFirstB(){...}
 @XmlAnyElement
 public B getSecondB(){...}
}

// some concrete implementations of B
@XmlRootElement
public class BImpl implements B {...}

@XmlRootElement
public class AnotherBImpl implements B {...}

Я получаю следующее:

<bimpl>
 </bimpl>

Но я хочу различать свойства. Как я могу получить:

<firstb>
 <bimpl>
 </bimpl></firstb>
 <secondb>
 <anotherbimpl>
 </anotherbimpl></secondb>

Поскольку свойства не являются коллекциями, я не могу использовать @XmlElementWrapper.

Я не хочу менять код, если его можно избежать.

Любые мысли оценили. Маршаллинг в JAXB кажется очень сложным.

3 ответа

Замените @XmlAnyElement на @XmlElement(type = Object.class). Это будет отличать отдельные поля.

Подробнее об этом решении я отвечу на соответствующий вопрос.


Я думаю, в вашем случае не может быть волшебства. Либо используйте простой класс-оболочку (для классического JAXB), либо используйте @XmlPath (для MOXy) (подтверждения Blaise Doughan).


Вы не можете маршевать интерфейсы в JAXB. Как бы маркетолог знал, как создать экземпляр вашего интерфейса? Проверьте это, у него действительно хорошее объяснение.

licensed under cc by-sa 3.0 with attribution.