JAXB - может ли быть ограничено содержание класса при сортировке в XML? - PullRequest
5 голосов
/ 02 декабря 2011

Скажите, у меня есть два класса:

@XmlRootElement
class A {
    @XmlElement
    String propertyOfA;
    @XmlElement
    B b;
}

class B {
    @XmlElement
    String propertyOfB;
} 

JAXB возвращает XML, отформатированный следующим образом:

<a>
  <propertyOfA>valueA</propertyOfA>
  <b>
    <propertyOfB>valueB</propertyOfB>
  </b>
</a>

У меня вопрос как сгладить иерархию в XML? Так что у меня есть:

<a>
  <propertyOfA>valueA</propertyOfA>
  <propertyOfB>valueB</propertyOfB>
</a>

Можно ли это сделать с помощью аннотаций?

В данный момент я думаю создать некий класс-обертку для A, в котором поля были бы созданы так, как я хочу видеть их в XML. Есть ли лучший способ?

Ответы [ 4 ]

4 голосов
/ 02 декабря 2011

Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222) экспертная группа.

Вы можете использовать расширение @XmlPath MOXy для отображения этого варианта использования:

import java.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
class A {
    @XmlElement
    String propertyOfA;

    @XmlPath(".")
    B b;
}

Для получения дополнительной информации

4 голосов
/ 02 декабря 2011

Это было для меня какое-то время, но позвольте мне дать ему трещину:

@XmlRootElement
class A {
    @XmlElement
    String propertyOfA;
    @XmlElement(name="propertyOfB")
    B b;
}
@XmlType(name="")
class B {
    @XmlValue
    String propertyOfB;
} 

Редактировать: отказ от ответственности - я не скомпилировал или не пробовал это.Но я верю, что это то, как ты это делаешь.

0 голосов
/ 04 июля 2013

Альтернативный подход (со стандартным JAXB) будет использовать @XmlJavaTypeAdapter. Таким образом, вы можете адаптировать иерархию объектов с недостатком необходимости писать код, который переводит иерархию объектов в адаптированный новый класс. Однако в вашем примере это не сработает, поскольку вам придется адаптировать класс A, который является вашим корнем. Однако, если иерархия была глубже и вам нужно было сделать адаптацию на один уровень ниже, чем корень, то проблем не было бы. Предложение, которое может быть полезным, - это написать код в адаптированном объекте, сделав его делегатом в иерархии объектов, а не адаптером, который тогда будет очень тонким.

0 голосов
/ 03 декабря 2011

Посмотрите на этот вопрос и предложенное решение: Spring RESTful клиент: исключение корневого тега

Очень полезно для решения такого рода проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...