Modelo de artigo a ser utilizado v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);}

Introdução a JAXB 2

Iniciando o uso da especificação Java Architecture for XML Binding.

 

A JAXB é uma das APIs da plataforma Java EE e fornece suporte à manipulação de objetos Java e XML. Sua principal característica é a capacidade de vincular XML a objetos Java e vice-versa. E o melhor é que ela já está incluída na JDK 6.

 

Usando JAXB somos capazes de criar facilmente classes a partir de um schema (XSD). Isso mesmo. Com ela somos capazes de transformar um arquivo XSD em um conjunto de classes num piscar de olhos. Mas isso será assunto para outro artigo. No momento vamos nos focar nos processos de Marshall e Unmarshall.

Marshall é o processo de transformar objetos Java em XML e o Unmarshall faz o caminho inverso, usa os dados de um XML para popular objetos Java.

 

Para o artigo eu estou usando JDK 6 e Netbeans IDE 6.1.

 

Criando XML a partir de objetos Java

Vamos usar o processo de Marshall para transformar objetos Java em XML com o uso de anotações.

 

O primeiro passo é criar um novo projeto Java com o nome JAXBContato.

 

Criando os POJOs

Crie a classe principal Contato como exibido na Listagem 01. Note que ela possui a uma anotação @XmlRootElement. Essa anotação indica que o valor da classe será representado como um elemento XML principal.

 

package contato;

 

import javax.xml.bind.annotation.XmlRootElement;

 

@XmlRootElement

public class Contato {

 

    private String nome;

    private String sexo;

    private int idade;

    private Endereco endereco;

 

    public Contato() {

    }

 

    public Contato(String nome, String sexo, int idade,

            Endereco endereco) {

        this.nome = nome;

        this.sexo = sexo;

        this.idade = idade;

        this.endereco = endereco;

    }

 

    /* Métodos getters e setters omitidos para não ocupar espaço */

}

Listagem 01. Código do contato.

 

A segunda classe a ser criada será Endereço (Listagem 02). Perceba que a classe de endereço está com uma anotação diferente da anterior. A anotação @XmlType indica que essa classe na verdade mapeia um tipo de informação específico (XML schema). Como a classe Contato possui o atributo endereco do tipo Endereço, então as informações do endereço estarão dentro do objeto contato que será criado.

 

package contato;

 

import javax.xml.bind.annotation.XmlType;

 

@XmlType

public class Endereco {

 

    public Endereco() {

    }

 

    public Endereco(String logradouro, int numero, String bairro,

            String cidade, String cep) {

        this.logradouro = logradouro;

        this.numero = numero;

        this.bairro = bairro;

        this.cidade = cidade;

        this.cep = cep;

    }

 

    private String logradouro;

    private int numero;

    private String bairro;

    private String cidade;

    private String cep;

 

    /* Métodos getters e setters omitidos para não ocupar espaço */

}

Listagem 02. Código do endereço.

 

Entendendo e Testando

Para testar iremos criar uma classe que chamaremos JAXBTeste como na Listagem 03.

 

Agora vamos por partes.

 

Criamos os objetos contato e endereço, e populamos seus atributos. Para criar o XML precisamos de um JAXBContext. Iremos criar um objeto context passando o nome do nosso pacote ao JAXBContext. Esse context nos fornecerá um objeto Marshaller, e é o Marshaller que tem a capacidade de transformar objetos Java em XML.

 

Um ponto importante é a necessidade de um arquivo com o nome jaxb.index, contendo o nome das classes que queremos transformar em XML, e deve estar no mesmo pacote das classes (Figura 01). Ele é requerido pelo JAXB para gerar as classes em tempo de execução. Essa não é a única forma de fazer isso, mas é a que atende ao nosso caso específico.

 

introjaxb2fig01.png

Figura 01. Arquivo jaxb.index

 

package contato;

 

/* Os imports foram omitidos para não ocupar espaço */

 

public class JaxbTeste {

 

    public static void main(String args[]) throws JAXBException, FileNotFoundException{

       

        Endereco endereco = new Endereco("Rua Moraes", 40, "Centro",

                "Rio de Janeiro", "20000-000");

        Contato contato = new Contato("Marco Maciel", "M",

                 34, endereco);

 

        JAXBContext context = JAXBContext.newInstance("contato");

         

        //saída 1 – console

        Marshaller m = context.createMarshaller();

        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        m.marshal(contato, System.out);

 

        //saída 2 – arquivo

        File f = new File("src/contato.xml");

        Marshaller m2 = context.createMarshaller();

        m2.marshal(contato, new FileOutputStream(f));       

    }

}

Listagem 03. Código de teste.

 

Usamos duas formas de apresentar o XML. A primeira é através do console e a segunda é para arquivo.

 

A saída na tela e o arquivo gerado devem estar parecidos com a listagem abaixo (Listagem 04). Note que a tag endereço foi criada dentro da tag contato. Lembra que a classe Contato possui um atributo do tipo Endereço? 

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<contato>

    <idade>34</idade>

    <nome>Marco Maciel</nome>

    <sexo>M</sexo>

    <endereco>

        <bairro>Centro</bairro>

        <cep>20000-000</cep>

        <cidade>Rio de Janeiro</cidade>

        <logradouro>Rua Moraes</logradouro>

        <numero>40</numero>

    </endereco>

</contato>

Listagem 04. XML gerado.

 

Vinculando objetos Java a partir de XML

Vamos usar o processo de Unmarshall para vincular as informações contidas em um arquivo XML a objetos Java.

 

Para isso iremos usar o mesmo arquivo criado anteriormente. Vamos copiá-lo e mudar seu nome para contato2.xml. Nele iremos alterar algumas informações só para verificar se o processo irá funcionar.

 

Agora iremos incluir as linhas abaixo (Listagem 05) ao final da nossa classe de teste. Na primeira linha usamos o mesmo context para criar um Unmarshaller. Depois o Unmarshaller cria um objeto usando as informações do arquivo alterado contato2.xml. Só para testar iremos mostrar o conteúdo desse objeto no console usando o formato XML, e também através dos getters do novo contato criado.

 

Unmarshaller um = context.createUnmarshaller();

Object obj = um.unmarshal(new File("src/contato2.xml"));

m.marshal(obj, System.out);

Contato contato2 = (Contato) obj;     

System.out.println(contato2.getNome()+" "+contato2.getSexo());

Listagem 05. Fazendo Unmarsheller.

 

Como vocês viram, trabalhar com Java e XML ficou moleza usando JAXB 2.

 

Um grande abraço e até a próxima,

 

Marco Antonio Maciel.