Статьи

JAXB — Представление пустых и пустых коллекций

Демонстрационный код

Следующий демонстрационный код будет использоваться для всех различных версий модели 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
        xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
        xsi:nil='true'/>
    <emptyCollection/>
    <populatedCollection>
        <populatedCollection>foo</populatedCollection>
        <populatedCollection>bar</populatedCollection>
    </populatedCollection>
</root>

Ссылка: JAXB — Представление пустых и пустых коллекций от нашего партнера по JCG Блейза Дафана в блоге Java XML & JSON Binding .