Демонстрационный код
Следующий демонстрационный код будет использоваться для всех различных версий модели Java. Он просто устанавливает одну коллекцию в ноль, вторую — в пустой список, а в третью — в заполненный список.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package package blog.xmlelementwrapper;import java.util.ArrayList;import javax.xml.bind.*;public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Root.class); Root root = new Root(); root.nullCollection = null; root.emptyCollection = new ArrayList<String>(); root.populatedCollection = new ArrayList<String>(); root.populatedCollection.add('foo'); root.populatedCollection.add('bar'); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(root, System.out); }} |
Mapping # 1 — по умолчанию
Модели JAXB не требуют аннотаций (см. JAXB — Аннотации не требуются). Сначала мы рассмотрим поведение по умолчанию для свойств коллекции.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
package blog.xmlelementwrapper;import java.util.List;import javax.xml.bind.annotation.*;@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)public class Root { List<String> nullCollection; List<String> emptyCollection; List<String> populatedCollection;} |
Изучив выходные данные, мы видим, что выходные данные, соответствующие полям nullCollection и emptyCollection, совпадают. Это означает, что с отображением по умолчанию мы не можем использовать экземпляр в обоих направлениях. Для немаршального сценария использования значения nullCollection и emptyCollection значения полей будут такими, какими их инициализировал класс (в данном случае null).
|
1
2
3
4
5
|
<?xml version='1.0' encoding='UTF-8'?><root> <populatedCollection>foo</populatedCollection> <populatedCollection>bar</populatedCollection></root> |
Отображение № 2 — @XmlElementWrapper
Аннотация @XmlElementWrapper используется для добавления элемента группировки вокруг содержимого коллекции. Помимо изменения внешнего вида представления XML, оно также позволяет нам различать пустые и пустые коллекции.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
package blog.xmlelementwrapper;import java.util.List;import javax.xml.bind.annotation.*;@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)public class Root { @XmlElementWrapper List<String> nullCollection; @XmlElementWrapper List<String> emptyCollection; @XmlElementWrapper List<String> populatedCollection;} |
Представление для нулевой коллекции остается прежним, оно отсутствует в документе XML. Для пустой коллекции мы видим, что маршалируется только элемент группировки. Поскольку представления для null и empty разные, мы можем использовать этот вариант использования в оба конца.
|
1
2
3
4
5
6
7
8
|
<?xml version='1.0' encoding='UTF-8'?><root> <emptyCollection/> <populatedCollection> <populatedCollection>foo</populatedCollection> <populatedCollection>bar</populatedCollection> </populatedCollection></root> |
Отображение № 3 — @XmlElementWrapper (nillable = true)
Свойство nillable в аннотации @XmlElementWrapper можно использовать для изменения XML-представления пустых коллекций.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
package blog.xmlelementwrapper;import java.util.List;import javax.xml.bind.annotation.*;@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)public class Root { @XmlElementWrapper(nillable=true) List<String> nullCollection; @XmlElementWrapper(nillable=true) List<String> emptyCollection; @XmlElementWrapper(nillable=true) List<String> populatedCollection;} |
Теперь элемент группировки присутствует для всех трех полей. Атрибут xsi: nil используется для указания того, что поле nullCollection было пустым. Как и в предыдущем отображении, это может быть круговое отключение.
|
01
02
03
04
05
06
07
08
09
10
11
|
<?xml version='1.0' encoding='UTF-8'?><root> <nullCollection xsi:nil='true'/> <emptyCollection/> <populatedCollection> <populatedCollection>foo</populatedCollection> <populatedCollection>bar</populatedCollection> </populatedCollection></root> |
Ссылка: JAXB — Представление пустых и пустых коллекций от нашего партнера по JCG Блейза Дафана в блоге Java XML & JSON Binding .