Neste artigo iremos mostrar de maneira prática, diversas formas de se injetarem dados de uma requisição HTTP em métodos Java, usando a especificação Java para WS Rest, ou JAX-RS. De acordo com esta especificação, é possível se implementar um recurso web como um documento, uma imagem, ou o cadastro de um usuário, utilizando-se classes Java para representar esses recursos. Para isso, iremos construir uma aplicação, a musicApp, uma loja on-line para vendas de ingressos de shows, e outros artigos relacionados a Rock, utilizando o framework RESTEasy. A figura 1 mostra alguns recursos da nossa aplicação, e como são representados por métodos e classes Java, mostrados na Listagem 1.

Representação de um recurso de nossa aplicação

Figura 1: Representação de um recurso de nossa aplicação

Listagem1: Classe de recurso ShowResource da aplicação musicApp


@Path("/show")
public class ShowResource {

  @GET
  @Path("/comprar")
  @Produces(MediaType.TEXT_PLAIN)
  public Double comprarIngresso() {
  
    Double valorIngresso = 150.00;
    
    return valorIngresso;
  }
  
}

Tudo bem até agora, mas vamos pensar em um cenário mais real. E se quisermos realmente comprar um ingresso? Precisaríamos informar, por exemplo, qual show pretendemos ir, e quantos ingressos vamos querer comprar. Mas para fazer isso, precisamos passar alguns parâmetros para o método comprarIngresso(). Este método, em nosso caso, será responsável por realizar o cálculo do valor a ser pago pelo ingresso, mas em outros cenários, poderia delegar esta obrigação para um objeto de negócio. Certo, mas como podemos fazer o nosso método receber diretamente informações do HTTP? Não se preocupe, a especificação JAX-RS cuidou disso para nós. Existem diversas formas de se fazer isso, através das anotações presentes nessa especificação. Vamos a elas:

Nome do Parâmetro Anotação Equivalente Exemplos de URL
PathParam @ PathParam /show/comprar/Angra/4
MatrixParam @ MatrixParam /show/comprar;A1=Angra;A2=4
QueryParam @ QueryParam /show/comprar?A1=Angra&A2=4

Os parâmetros definidos através da anotação @PATH podem ser recuperados através das anotações @PathParam, @MatrixParam, @QueryParam, sendo que cada anotação corresponde a um tipo de manipulação de URI diferente, conforme mostrado na tabela acima. Essas anotações são aplicadas nos argumentos dos métodos de uma resource class. A Listagem 1 mostra o exemplo de um @PathParam, a Listagem 2 mostra o exemplo de um @MatrixParam, e a Listagem 3 o exemplo de uma @QueryParam.

Listagem 2: Exemplo de um @PathParam


@GET
 @Path("/comprar/{A1}/{A2}")
 @Produces(MediaType.TEXT_PLAIN)
 public Double comprarIngresso (@PathParam("A1") String show, @PathParam("A2") Double quantidade){
  
  double valorIngresso = 0.0;
  
  if (show.equalsIgnoreCase("METALLICA")){
    valorIngresso = 250.00;
  }else if (show.equalsIgnoreCase("MATANZA")){
    valorIngresso = 50.00;
  }
  
  return valorIngresso * quantidade;
}
  

Para acessarmos o recurso mostrado na Listagem 2, iremos digitar a seguinte URL: http://localhost:8080/musicApp/show/comprar/MATANZA/3. Feito isso, iremos obter o resultado 150.0, no browser.

Listagem 3: Exemplo de um @MatrixParam

 
@GET
 @Path("/comprar")
 @Produces(MediaType.TEXT_PLAIN)
 public Double comprarIngresso (@MatrixParam("A1") String show, @MatrixParam("A2") Double quantidade){
  
  double valorIngresso = 0.0;
  
  if (show.equalsIgnoreCase("METTALICA")){
    valorIngresso = 250.00;
  }else if (show.equalsIgnoreCase("MATANZA")){
    valorIngresso = 50.00;
  }
  
  return valorIngresso * quantidade;

  }
  

Para acessarmos o recurso mostrado na Listagem 3, iremos digitar a seguinte URL: http://localhost:8080/musicApp/show/comprar;A1=MATANZA;A2=4. Feito isso, o resultado 200.0 irá aparecer no browser.

Listagem 4: Exemplo de um @QueryParam


@GET
 @Path("/comprar")
 @Produces(MediaType.TEXT_PLAIN)
 public Double comprarIngresso (@QueryParam("A1") String show, @QueryParam("A2") Double quantidade){
  
  double valorIngresso = 0.0;
  
  if (show.equalsIgnoreCase("METTALICA")){
    valorIngresso = 250.00;
  }else if (show.equalsIgnoreCase("MATANZA")){
    valorIngresso = 50.00;
  }
  
  return valorIngresso * quantidade;

}
  

Para acessarmos o recurso mostrado na Listagem 4, iremos digitar a seguinte URL: http://localhost:8080/musicApp/show/comprar?A1=MATANZA&A2=9. Feito isso, o resultado 450.0 irá aparecer no browser.

Para a aplicação que iremos desenvolver neste artigo, utilizaremos o framework RESTEasy, incorporado nativamente ao servidor de aplicação JBoss AS7. Este servidor já deve estar instalado e configurado, juntamente com a 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 à 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, conforme a Listagem 4. Após isso, vamos criar nossa classe de recurso, onde serão inseridos todos os métodos mostrados anteriormente.

Listagem 5: Adicionando o RestEasy no deployment Descriptor


<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
  </context-param>
  
  <listener>
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
  </listener>
  
  <servlet>
    <servlet-name>resteasy-servlet</servlet-name>
    <servlet-class>
      org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>resteasy-servlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

A Listagem 6 mostra a nossa aplicação completa, com todos os métodos e seus respectivos parâmetros.

Listagem 6: Classe Recurso com todos os métodos mostrados no artigo


import javax.ws.rs.GET;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

@Path("/show")
public class ShowResource {

   @GET
   @Path("/comprar/{A1}/{A2}")
   @Produces(MediaType.TEXT_PLAIN)
   public Double comprarIngressoPath (@PathParam("A1") String show, @PathParam("A2") Double quantidade){
    
    double valorIngresso = 0.0;
    
    if (show.equalsIgnoreCase("METALLICA")){
      valorIngresso = 250.00;
    }else if (show.equalsIgnoreCase("MATANZA")){
      valorIngresso = 50.00;
    }
    
    return valorIngresso * quantidade;
  }
   
   @GET
   @Path("/comprar")
   @Produces(MediaType.TEXT_PLAIN)
   public Double comprarIngressoMatrix (@MatrixParam("A1") String show, @MatrixParam("A2") Double quantidade){
    
    double valorIngresso = 0.0;
    
    if (show.equalsIgnoreCase("METTALICA")){
      valorIngresso = 250.00;
    }else if (show.equalsIgnoreCase("MATANZA")){
      valorIngresso = 50.00;
    }
    
    return valorIngresso * quantidade;

    }


   @GET
   @Path("/comprar")
   @Produces(MediaType.TEXT_PLAIN)
   public Double comprarIngressoQuery (@QueryParam("A1") String show, @QueryParam("A2") Double quantidade){
    
    double valorIngresso = 0.0;
    
    if (show.equalsIgnoreCase("METTALICA")){
      valorIngresso = 250.00;
    }else if (show.equalsIgnoreCase("MATANZA")){
      valorIngresso = 50.00;
    }
    
    return valorIngresso * quantidade;

  }

}
  

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