Демонстрационный код
Следующий демонстрационный код будет использоваться для всех различных версий модели 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 .