JAXB2: примеры преобразование Object в XML
На данной странице кратко описывается технология OXM (Object XML Mapping) и показывается пример использованием JAXB2.Немного новых слов:
JAXB (Java Architecture for XML Binding) - данная архитектура, позволяет Java разработчикам преобразовавать объекты в XML и наоборот.
Основные возможности JAXB:
- marshalling - преобразование объекта в XML
- unmarshalling - преобразование XML в объект
Библиотеки необходимые для работы примеров
Поскольку JAXB входит в стандартную поставку Java, то для работы примеров, в проект достаточно подключить только стандартные Java библиотеки.Примеры использования: преобразование Object в XML
Пример "Hello JAXB2"
Первый пример, основан на классическом примере Hello World, в нем трансформируем объект HelloMessage в XML, код класса HelloMessage показан ниже:
public class HelloMessage {
private String message = "Hello JAXB2";
public String getHelloMessage(){
return message;
}
public void setHelloMessage(String m){
this.message = m;
}
}
Обратим внимание, что класс не содержит никаких аннотаций, это простой Java class.
Код с комментариями, при помощи которого происходит трансформация объекта в XML, показан ниже.
// Создаем экземпляр JAXBContext, в качестве параметра, передаем класс с которым мы будем работать используя OXM
// Более подробную информацию об использвании JAXBContext можно посмотреть тут: http://docs.oracle.com/javaee/6/api/javax/xml/bind/JAXBContext.html
JAXBContext context = JAXBContext.newInstance(HelloMessage.class);
// Получаем ссылку на объект, который будет выполнять преобразование Object -> XML
Marshaller marshaller = context.createMarshaller();
// Указываем в настройке, что XML должен быть отоформатирован
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// Создаем экземпляр объекта, который мы будем преобразовывать в XML
HelloMessage helloMessage = new HelloMessage();
// Поскольку, наш объект не содержит аннотаций, мы должны работать с ним использую JAXBElement, в нем
// указываем название рутового элемента в создаваемом XML
JAXBElement<HelloMessage> jaxbElement = new JAXBElement<HelloMessage>(new QName("hello_message"), HelloMessage.class,helloMessage);
// Выводим XML на экран, обращаем внимание, что строка отформатирована
marshaller.marshal(jaxbElement, System.out);
В результате выполнения этого кода получается следующий XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<hello_message>
<helloMessage>Hello JAXB2</helloMessage>
</hello_message>
На основании этого примера, мы видим, что при помощи JAXB мы можем преобразовать в XML Java объект.
Добавим в класс аннотаций
Создадим, новый класс HelloMessageCompexAnnotated, в котором расставим аннотации:
import javax.xml.bind.annotation.*;
@XmlRootElement(name="hello_message")
public class HelloMessageComplexAnnotated {
private String message = "Hello JAXB2";
private String language = "EN";
private String messageNotForXML = "not for XML text";
public HelloMessageComplexAnnotated() {
}
public HelloMessageComplexAnnotated(String lang, String message) {
this.language = lang;
this.message = message;
}
@XmlValue
public String getMessage() {
return message;
}
public void setMessage(String m) {
this.message = m;
}
@XmlAttribute(name="lang")
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
@XmlTransient
public String getMessageNotForXML() {
return messageNotForXML;
}
public void setMessageNotForXML(String messageNotForXML) {
this.messageNotForXML = messageNotForXML;
}
}
Напишем Java код для трансформации:
// В этом примере, мы создаем контекст передавая туда название пакетов, в которых находятся
// классы которые будут преобразовыватся. При этом, в директории должен находится файл jaxb.index,
// в котором перечисленны название классов.
// Более подробную информацию об использвании JAXBContext можно посмотреть тут: http://docs.oracle.com/javaee/6/api/javax/xml/bind/JAXBContext.html
JAXBContext context = JAXBContext.newInstance("lv.nixx.poc.jaxb.model");
// Получаем ссылку на объект, который будет выполнять преобразование Object в XML
Marshaller marshaller = context.createMarshaller();
// Указываем в настройке, что XML должен быть отоформатирован
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// Создаем экземпляр объекта, который мы будем преобразовывать в XML
HelloMessageComplexAnnotated helloMessage = new HelloMessageComplexAnnotated();
System.out.println("Annotated object (HelloMessageComplexAnnotated) as XML");
// Поскольку, наш объект содержит аннотацию, которая указывает что будет являтся рутовым элементом XML, то // преобразование значенительно проще: достаточно лишь передать экземпляр объекта для преобразования
marshaller.marshal(helloMessage, System.out);В результате получим XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <hello_message lang="EN">Hello JAXB2</hello_message>Поскольку, объект которые преобразовывается в XML содержит аннотации, то трансформатор создает структура XML основываясь на них. При этом, обратите внимание, что поле помеченное аннотацией @XmlTransient в полученный XML не попало.
Трансформируем класс cо списком
Чтобы сделать пример более интересным, создадим класс со встроенным списком и преобразуем его в XML. Обратите внимание на аннотации в коде класса
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="hello_message_list")
public class HelloMessageList {
private List<hellomessagecomplexannotated> list = new ArrayList<hellomessagecomplexannotated>();
public void addMessage(HelloMessageComplexAnnotated msg){
this.list.add(msg);
}
@XmlElementRef
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
}
Преобразуем данный класс в XML:
// Создаем экземпляр JAXBContext, в качестве параметра, передаем класс с которым мы будем работать используя OXM
// Более подробную информацию об использвании JAXBContext можно посмотреть тут: http://docs.oracle.com/javaee/6/api/javax/xml/bind/JAXBContext.html
JAXBContext context = JAXBContext.newInstance(HelloMessageList.class);
// Получаем ссылку на объект, который будет выполнять преобразование Object -> XML
Marshaller marshaller = context.createMarshaller();
// Указываем в настройке, что XML должен быть отоформатирован
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// Создаем экземпляр объекта, который мы будем преобразовывать в XML
HelloMessageList helloMessage = new HelloMessageList();
helloMessage.addMessage(new HelloMessageComplexAnnotated("ru", "привет JAXB"));
helloMessage.addMessage(new HelloMessageComplexAnnotated("en", "hello JAXB"));
helloMessage.addMessage(new HelloMessageComplexAnnotated("lv", "sveiks JAXB"));
System.out.println("Annotated object (HelloMessageList) as XML");
marshaller.marshal(helloMessage, System.out);
В результате трансформации получим в XML, которое показано ниже:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<hello_message_list>
<hello_message lang="ru">Привет JAXB</hello_message>
<hello_message lang="en">hello JAXB</hello_message>
<hello_message lang="lv">sveiks JAXB</hello_message>
</hello_message_list>
Комментариев нет:
Отправить комментарий