Web Services Usando Maven, Spring e JAXB [Parte 2]

No post anterior introduzimos a tecnologia de Web Services (WS) como uma ferramenta de integração entre sistema, que pelo fato de basear-se em mensagens no formato XML, oferece alta interoperabilidade. Mencionamos ainda alguns frameworks e APIs que podem ser usados para implementação de um WS em Java (veja o post completo aqui: Parte 1). Neste post iremos continuar nossa discussão, explorando a JAXB API.

Requisitos do Serviço

Implementaremos um serviço de consulta de mensagens de erro em que, a partir de um determinado período, uma lista de erros é obtida. A Listagem 1 apresenta um exemplo do XML de entrada. Os dados para a requisição são encapsulados no tipo complexo “ConsultaErrosRequest” que contém os elementos “tipoErro”, “dataInicio” e “dataFim”. O primeiro permite que seja especificado quais tipos de erros deverão ser buscados, ao passo que, “dataInicio” e “dataFim” determinam o período da busca.

<ConsultaErrosRequest>
<tipoErro>TODOS</tipoErro>
<dataInicio>2013-07-01</dataInicio>
<dataFim>2013-07-10</dataFim>
</ConsultaErrosRequest>
Listagem 1 – Modelo do XML de entrada ConsultaErrosRequest. Para cada requisição é obrigatória a especificação do tipo de erro a ser buscado (elemento @tipoErro) bem como a data de início (elemento @dataInicio). Opcionalmente é possível limitar o intervalo da busca utilizando uma data de término (elemento @dataFim).

Um exemplo do XML de retorno é apresentado na Listagem 2. A mensagem de resposta é encapsulada no tipo complexo “ConsultaErrosResponse”. Note a presença do elemento “tipoErro” refletindo o nível de informação que foi requisitada. Em seguida uma lista de erros é exibida de forma aninhada através do elemento “erros”. Cada elemento “erro” apresenta um erro encontrado, detalhando a data em que o erro ocorreu (elemento “data”), o tipo daquele erro (elemento “tipoErro”), e a mensagem do erro ( elemento “mensagem”).

<ConsultaErrosResponse>
<tipoErro>TODOS</tipoErro>
<erros>
<erro>
<data>2013-07-10</data>
<tipoErro>ERRO</tipoErro>
<mensagem>Falha durante agendamento</mensagem>
</erro>
<erro>
<data>2013-07-13</data>
<tipoErro>WARNING</tipoErro>
<mensagem>Utilizando configuracoes padrao</mensagem>
</erro>
</erros>
</ConsultaErrosResponse>
Listagem 2 – Modelo do XML de saída ConsultaErrosResponse. Para cada resposta é exibida o nível de erros requisistado (elemento @tipoErro) e uma lista de errors (elemento @erros). A lista é composta por um ou mais erros (elemento @erro), que por sua vez é composto pela data em que aquele erro ocorreu (@data), o tipo do erro (elemento @tipoErro) e a mensagem (elemento @mensagem).

Mapeando XML de Entrada em um Objeto Java

A Listagem 3 apresenta a definição da classe ConsultaErrosRequest. Através de um conjunto de anotações fornecidos pela JAXB API é possível listar todos os detalhes de mapeamento necessários para realizar a conversão entre XML e objeto Java.

@XmlRootElement(name = "ConsultaErrosRequest")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = Namespaces.NAMESPACE)
public class ConsultaErrosRequest {

@XmlElement(nillable = false, required = true)
private TipoErro tipoErro;

@XmlElement(nillable = false, required = true)
@XmlSchemaType(name = "date")
private Date dataInicio;

@XmlElement(nillable = true, required = false)
@XmlSchemaType(name = "date")
private Date dataFim;

... Setters e Getters ...
}
Listagem 3 – Definição da classe ConsultaErrosRequest. As anotações JAXB permitem que o mapeamento entre XML e objeto Java seja realizado automaticamente.

Utilizando uma simples configuração é possível construir uma classe responsável por gerar instâncias mapeadas a partir de um XML de entrada.

O elemento @XmlRootElement indica a raiz do XML. Deve-se sempre dar um nome para a raíz. @XmlAccessorType indica que as tags do XML serão geradas com o mesmo nome dos atributos da classe. @XmlType é utilizada para estabelecer uma associação entre o XML e um schema. @XmlElement mapea um atributo da classe para um elemento XML. @XmlSchemaType indica qual o tipo do atributo. Quando não especificada, o JABX irá inferir o tipo do elemento XML com base no tipo do atributo Java.

Mapeando Objeto Java em um XML de Resposta

A Listagem 4 apresenta a representação Java do XML de resposta através da classe ConsultaErrosResponse.

@XmlRootElement(name = "ConsultaErrosResponse")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = Namespaces.NAMESPACE)
public class ConsultaErrosResponse {

@XmlElement(nillable = false, required = true)
private TipoErro tipoErro;

@XmlElementWrapper(required = false, name = "erros")
@XmlElement(name = "erro", required = false)
private List<ErroSistema> erros;

... Setters e Getters ...
}
Listagem 4 – Definição da classe ConsultaErrosResponse. As anotações JAXB permitem que o mapeamento entre XML e objeto Java seja realizado automaticamente.

Note a presença de uma anotação ainda não discutida: @XmlElementWrapper. Com tal anotação é possível encapsular uma lista de elementos em um elemento comum. No exemplo apresentado, uma lista de elementos <erro> é agrupada em um elemento <erros>.

A lista de erros, é formada por objetos do tipo ErroSistema que também deve ter as anotação necessárias para o JAXB (Listagem 5).

@XmlRootElement(name = "ErroSistema")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = Namespaces.NAMESPACE)
public class ErroSistema {

@XmlElement(nillable = false, required = true)
@XmlSchemaType(name = "date")
private Date data;

@XmlElement(nillable = false, required = true)
private TipoErro tipoErro;

@XmlElement(nillable = true, required = false)
private String mensagem;

... Setters e Getters ...
}
Listagem 5 – Definição da classe ErroSistema. As anotações JAXB permitem que o mapeamento entre XML e objeto Java seja realizado automaticamente. Por motivos de espaço foram removidos as definições dos métodos setters e getters.

Encerramos assim o mapeamento XML-JAVA das mensagens que serão trafegadas no nosso WS. No próximo post mostraremos como criar o serviço que lê e gera tais mensagens utilizando o framework Spring.

Referências

[1] Spring-ws

Links Externos

JAXB API

Por MATERA SYSTEMS

Postado em: 04 de outubro de 2013

Confira outros artigos do nosso blog

REST não é JSON

21 de agosto de 2017

Bruno Sofiato

[Webinar] Profile de aplicações Java com Oracle Mission Control e Flight Recorder

24 de julho de 2017

Danival Calegari

Criando Mocks de serviços REST com SoapUI

27 de junho de 2017

Monise Costa

JavaScript 6: diferença entre var, let e const

09 de maio de 2017

Otávio Felipe do Prado

Deixe seu comentário