Construindo um serviço web com RESTEasy e JAXB

Veja neste artigo a construção de um serviço REST utilizando o framework RESTEasy e JAXB, uma especificação adicionada a partir da JDK 6 com o objetivo de realizar o binding (ligação/conversão) entre XML e objetos Java.

Neste artigo será demonstrada a construção de um serviço REST utilizando o framework RESTEasy e JAXB, uma especificação adicionada a partir da JDK 6 com o objetivo de realizar o binding (ligação/conversão) entre XML e objetos Java. Para mostrar os princípios desta especificação em conjunto com os Web Services Restful, iremos construir um aplicativo que disponibiliza um serviço REST, e as principais características e configurações que envolvem essas duas tecnologias.

Para a aplicação que iremos desenvolver neste artigo utilizaremos o framework RESTEasy, incorporado nativamente ao servidor de aplicação JBoss AS7, e o JAXB. Como este artigo se limita a disponibilizar um serviço, e este serviço será exposto por meio de XML, iremos falar um pouco sobre esta importante linguagem.

A XML é uma linguagem de marcação que serve para guardar dados de uma forma estruturada. A estrutura da XML pode ser definida pelo próprio usuário ou por um schema. Por ser o XML um arquivo de texto puro, e independente de plataforma, ele se torna muito utilizado para transmitir dados entre diferentes aplicações e sistemas. A Listagem 1 mostra um exemplo de código XML que será utilizado por nossa aplicação.

Listagem 1: Exemplo de arquivo XML

<?xml version="1.0" encoding="UTF-8"?> <user> <username>andre</username> <password>allet</ password> <id>1980</id> </user>

A linguagem XML normalmente obedece um schema que define quais são as regras que a estrutura do XML deve seguir, possibilitando que esse XML possa ser validado. A Listagem 2 mostra um exemplo de arquivo XSD. O XSD é como se fosse um “molde” para se gerar o XML.

Listagem 2: Exemplo de um arquivo XSD

<?xmlversion="1.0"encoding="UTF-8"?> <xsd:schemaxmlns:xsd="http://www.w3.org/2001/XMLSchema">   <xsd:elementname="user" type="User"/>   <xsd:complexTypename="User">     <xsd:sequence>       <xsd:elementname="username" type="xsd:string" minOccurs="1"         maxOccurs="1" nillable="false"/> <xsd:elementname="password" type="xsd:string"minOccurs="1"         maxOccurs="1" nillable="false"/> <xsd:elementname="id" type="xsd:int" minOccurs="1"         maxOccurs="1" nillable="false"/>     </xsd:sequence>   </xsd:complexType> </xsd:schema>

Não é o objetivo deste artigo explicar como a especificação JAXB realiza as conversões, mas para simples entendimento, o JAXB converte objetos Java para um schema XML, o que é chamado de Marshall. Ao contrário, quando temos o schema XML e queremos obter objetos Java, chamamos essa conversão de Unmarshall. Na especificação JAXB o Marshall e o Unmarshall são representados pelos objetos Marshaller e Unmarshaller, respectivamente. A Figura 1 mostra alguns detalhes de como o JAXB realiza estas conversões.


Figura 1: Conversões realizadas pelo JAXB (Fonte: Oracle)

O JAXB internamente se utiliza do XSD para realizar as conversões, sendo que o mapeamento entre as classes Java e o XML é realizado com o auxílio de anotações, presentes na própria especificação JAXB. Confuso? Você logo vai entender. Vamos começar a criar nossa aplicação, que no decorrer as coisas irão clareando.

Para realizar o exemplo deste artigo, é necessário que se tenha o servidor de aplicação JBoss AS7 instalado e configurado, juntamente com o IDE Eclipse para JEE. Vamos iniciar nossa aplicação criando um novo Dynamic Web Project no Eclipse selecionado o JBoss 7.1 como servidor de aplicação. Após isso, vamos em next, até a tela onde informaremos ao IDE que desejamos que gere o nosso Deployment Descriptor, conforme pode ser visto na Figura 3. Após isso, clique em finish.


Figura 2: Criando um novo Dynamic Web Project


Figura 3: Configurando o Deployment Descriptor

Antes de iniciar, configure o RESTEasy no Deployment Descriptor da aplicação. Após isso, vamos criar nossa classe de domínio da aplicação dentro do pacote domain. Esta classe será anotada para que o JAXB a reconheça e possa realizar as conversões.

Listagem 3: Classe User

package domain; importjavax.xml.bind.annotation.XmlAttribute; importjavax.xml.bind.annotation.XmlElement; importjavax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "user") public class User { String username; String password; int id; @XmlElement public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @XmlElement public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @XmlAttribute publicintgetId() { return id; } public void setId(int id) { this.id = id; } }

A anotação @XmlRootElement determina o elemento principal que será convertido para XML. As anotações @XmlElement e @XmlAttribute são utilizadas para mapear os atributos de nossa classe.

Listagem 4: Classe Recurso

packageresource; importjavax.ws.rs.GET; importjavax.ws.rs.Path; importjavax.ws.rs.Produces; importdomain.User; @Path("/user") publicclassUserService { @GET @Path("/get") @Produces("application/xml") public User getUserInXML() { User user = newUser(); user.setUsername("andre"); user.setPassword("allet"); user.setId(1980); returnuser; } }

A anotação @Path determina que nossa classe representa um recurso web (/user), e tem um sub-recurso(/get) que retorna um XML contendo um objeto do tipo User, sendo este reconhecido e mapeado pelo JAXB. Para acessar o serviço, basta executar o JBoss AS7 e em seguida digitar a url http://localhost:8080/restfulExample/user/get em seu browser favorito, conforme pode ser visto na Figura 4.


Figura 4: Serviço Rest que produz como retorno o XML de User

Este exemplo somente mostrou um serviço Rest com JAXB.

Bom pessoal, por hoje é isso, até o próximo artigo.

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados