JAXB: Как мне маршалировать, используя имя поля, когда возвращаемый тип является интерфейсом? - PullRequest
1 голос
/ 10 февраля 2012

Если у меня есть класс (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 {...}

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

<a>
    <bImpl/>
    <anotherBImpl/>
</a>

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

<a>
    <firstB>
        <bImpl/>
    </firstB>
    <secondB>
        <anotherBImpl/>
    </secondB>
</a>

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

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

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

Ответы [ 3 ]

1 голос
/ 19 января 2017

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

Подробнее об этом решении в моем ответе на связанный вопрос.

0 голосов
/ 12 февраля 2012

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

0 голосов
/ 10 февраля 2012

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

...