Модель предметной области
Я буду использовать следующую модель домена для этого примера. Обратите внимание, что нет никаких аннотаций.
Клиент
Клиент является корневым объектом в этом примере. Обычно мы аннотируем это @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 не требуется никаких аннотаций .