Статьи

JAXB — аннотации не требуются

Кажется, существует неправильное представление о том, что в модели требуются аннотации для использования реализации JAXB (JSR-222) . Правда в том, что JAXB является конфигурацией по исключению, поэтому аннотации требуются только тогда, когда вы хотите переопределить поведение по умолчанию. В этом примере я продемонстрирую, как использовать JAXB без предоставления каких-либо метаданных.

Модель предметной области

Я буду использовать следующую модель домена для этого примера. Обратите внимание, что нет никаких аннотаций.

Клиент

Клиент является корневым объектом в этом примере. Обычно мы аннотируем это @XmlRootElement . Позже в демонстрационном коде вы увидите, как вместо этого мы можем использовать экземпляр JAXBElement .

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
27
28
29
30
31
32
33
34
35
package blog.defaults;
 
import java.util.List;
 
public class Customer {
 
    private String firstName;
    private String lastName;
    private List<PhoneNumber> phoneNumbers;
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getLastName() {
        return lastName;
    }
 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
 
    public List<PhoneNumber> getPhoneNumbers() {
        return phoneNumbers;
    }
 
    public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }
 
}

Номер телефона

Я специально назвал поля в этом классе бессмысленными именами, так что позже, когда мы посмотрим на XML, вы сможете увидеть, что по умолчанию имена элементов получены из свойств, а не из полей.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package blog.defaults;
 
public class PhoneNumber {
 
    private String foo;
    private String bar;
 
    public String getType() {
        return foo;
    }
 
    public void setType(String type) {
        this.foo = type;
    }
 
    public String getNumber() {
        return bar;
    }
 
    public void setNumber(String number) {
        this.bar = number;
    }
 
}

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

Поскольку мы не использовали @XmlRootElement (или @XmlElementDecl ) для связи корневого элемента с нашим классом Customer, нам нужно будет сообщить JAXB, в какой класс мы хотим демонтировать XML-документ. Это делается с помощью одного из немаршальных методов, которые принимают параметр Class (строка 14). Это вернет J AXBElement , затем к объекту Customer можно обратиться, вызвав для него getValue (строка 15). Чтобы упорядочить объект обратно в XML, нам нужно убедиться, что он обернут в JAXBElement для предоставления информации о корневом элементе (строка 17).

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package blog.defaults;
 
import javax.xml.bind.*;
import javax.xml.namespace.QName;
import javax.xml.transform.stream.StreamSource;
 
public class Demo {
 
    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);
 
        StreamSource xml = new StreamSource("src/blog/defaults/input.xml");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        JAXBElement<Customer> je1 = unmarshaller.unmarshal(xml, Customer.class);
        Customer customer = je1.getValue();
 
        JAXBElement<Customer> je2 = new JAXBElement<Customer>(new QName("customer"), Customer.class, customer);
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(je2, System.out);
    }
 
}

Input.xml / выход

Ниже приведен ввод и вывод демонстрационного кода. Первое, что мы видим, это то, что это очень разумное представление данных в формате XML, никаких артефактов JAXB нет. По умолчанию JAXB будет маршалировать все как элементы XML, и на основе нашего класса PhoneNumber мы видим, что имена элементов были получены из имен свойств.

01
02
03
04
05
06
07
08
09
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<customer>
    <firstName>Jane</firstName>
    <lastName>Doe</lastName>
    <phoneNumbers>
        <number>555-1111</number>
        <type>work</type>
    </phoneNumbers>
    <phoneNumbers>
        <number>555-2222</number>
        <type>home</type>
    </phoneNumbers>
</customer>

Дальнейшее чтение

Если вам понравился этот пост, то вы также можете быть заинтересованы в:

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