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