domingo, 8 de dezembro de 2013

JAXB - Message Broker

Oi pessoal,

Vocês já em algum momento no Broker precisou ler um arquivo de configuração em xml? Já precisou consumir um xml e transformá-lo em objeto? O que você usou? Quem já trabalhou com xml sabe da dificuldade que podemos encontrar pelo caminho, e é esse tipo de situação que o JAXB pode resolver.

As vezes precisamos usar lógicas tao complexas, que ficamos de mãos atadas apenas usando a linguagem ESQL, e quem tem problemas para usar o JavaCompute, opta por utilizar classes Java externa para resolver seus problemas.

Uma solução eh usar JAXB pra a transição de xml da ferramente para uma classe Java.

Usando JAXB

Para começarmos usar o JAXB precisamos criar um Message Model:

1 - File > New > Other , procura por "Message Model" e clicar em "Next.



2 - Depois, Other XML > I already have an XML schema file for my data.

3 - Selecione sua aplicação ou Library, onde deve ser criado o Message Model, e especifique um xsd existente.



4 - Clique em Finish.

Agora já temos um Message Model criado a partir do seu xsd :)

Precisamos agora gerar as classes do JAXB a partir do seu Message Model.

1 - Clique com o botão direito no arquivo criado que deve estar em  "Schema Definition" da sua aplicação.

2 - Selecione Generate JAXB Java Object Classes, ao abrir você deve configurar os 3 campos. Onde:

  • Message Schema: Onde esta seu Message Model (Já preenchido).
  • Target Java Source Folder: AppJava da sua aplicação.
  • Target Java Package: Diretório onde será criada as classes.


3 - Clique em Finish.

Pronto já temos Nossas classes configuradas e prontas para usar.

Criando Um Xml a partir de um objeto JAXB

Para utilizarmos as classes basta usar um trecho de código simples que mostrarei a seguir:

Procurei separar em duas classes distintas como mostrado abaixo:


import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class CreateXml{
public String createMessageXml(CalculateAvailabilityScheduleResponseType objeto){

SATXMLFactory<CalculateAvailabilityScheduleResponseType> factory = null;
Marshaller marshaller = null;
try {
JAXBContext context = JAXBContext.newInstance(br.com.telefonica.esboss.CalculateAvailabilityScheduleResponseType.class);
marshaller = context.createMarshaller();
factory = new SATXMLFactory<CalculateAvailabilityScheduleResponseType>(objeto, marshaller);

} catch (Exception e) {
}
return factory.createXML(marshaller);
}
}




import java.io.StringWriter;
import java.io.Writer;

import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class XMLFactory<T> {

private T jAXBObject;

public XMLFactory(T jAXBObject, Marshaller marshaller){

try {
this.jAXBObject = jAXBObject;
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
} catch (Exception e) {
e.printStackTrace();
}
}

public String createXML(Marshaller marshaller){
try {
Writer wr = new StringWriter();
marshaller.marshal(jAXBObject, wr);
return wr.toString();
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
}

O ponto focal dessas classes fica por conta da Classe Marshaller que faz a conversão do Objeto em um XML.

Pode ser feito o contrário também, a partir de um XML criar um objeto como os valores correspondentes, usando Unmarshal.

Com isso conseguimos gerar um xml válido baseado no nosso XSD.

<tns:compras>
<tns:tipo>Carne</tns:tipo>
<tns:listtipoProduto>
<tns:tipoProduto>
<tns:valor>10.00</tns:valor>
<peso>200</peso>
</tns:tipoProduto>
</tns:listTipoProduto>
</tns:compras>

Vimos de uma fácil resolver esse problema de conversão de xml.

Se gostaram do Post ajude a divulgar, deixe seu comentário, até a próxima