JAXB2 примеры преобразования Object в XML

JAXB2: примеры преобразование Object в XML

На данной странице кратко описывается технология OXM (Object XML Mapping) и показывается пример использованием JAXB2.

Немного новых слов:
JAXB (Java Architecture for XML Binding) - данная архитектура, позволяет Java разработчикам преобразовавать объекты в XML и наоборот.
Основные возможности JAXB:
  •    marshalling - преобразование объекта в XML
  •     unmarshalling - преобразование XML в объект
JAXB является частью Java SE платформы (1.5 и выше) и одним из API Java EE, также частью Java Web Services Development Pack (JWSDP).

Библиотеки необходимые для работы примеров

Поскольку 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>

Комментариев нет:

Отправить комментарий