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.

Conversões realizadas pelo JAXB (Fonte: Oracle)

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.

Criando um novo Dynamic Web Project

Figura 2: Criando um novo Dynamic Web Project

Configurando o Deployment Descriptor

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.

Serviço Rest que produz como retorno o XML de User

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.