Модель предметной области
Я буду использовать следующую модель домена для этого примера. Обратите внимание, что нет никаких аннотаций.
Клиент
Клиент является корневым объектом в этом примере. Обычно мы аннотируем это @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 для поддержки различных вариантов использования. Я предлагаю вам ознакомиться с ними:
- Если вас интересует указание метаданных без использования аннотаций, вас может заинтересовать документ внешнего сопоставления EclipseLink JAXB (MOXy):
Ссылка: JAXB — от нашего партнера по JCG Блейза Дафана в блоге по связыванию Java XML и JSON не требуется никаких аннотаций .