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.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Vídeo