BT

O que há de novo no JAX-RS 2.0?

por Vikram Gupta , traduzido por Marcelo Cenerino em 16 Jul 2013 |

Quando foi lançado em 2008 pelo JSR-311, o JAX-RS 1.0 se tornou um dos primeiros frameworks Java baseados em classes POJO e anotações, para criação de aplicações web robustas.

Agora, cinco anos depois da primeira versão, o JAX-RS 2.0 é lançado no Java EE 7. A nova versão é baseada na JSR-339. Apresentaremos aqui algumas das novas funcionalidades que fazem com que a mudança para a versão 2.0 valha a pena. Mas antes disso, relembramos um pouco a JAX-RS 1.0, através de um exemplo:

1  @Path(portfolios) 
2  public class PortfolioResource { 
3     
4    @GET 
5    public Collection<Portfolio> allPortfolios() { 
6      . . . 
7    } 
8     
9    @GET 
10   public Portfolio getPortfolio(
          @PathParam("portfolioId") String id) { 
11     . . .
12   }
13 }

Nessa listagem, a linha 1 mapeia um recurso (portfólios) para o caminho relativo /portfolios. Na linha 4 é especificado que uma requisição GET deve retornar todos os portfólios existentes. As linhas 9 e 10 indicam que, em uma requisição GET a uma URI como /portfolios/123, o valor que sucede a URI do recurso deve ser extraído como um parâmetro (no caso, 123) e atribuído à variável "id", para que o portfólio associado a esse identificador seja então retornado pelo serviço.

A sintaxe usada no exemplo permanece idêntica no JAX-RS 2.0.

De forma consistente com o tema principal do Java EE 7, o JAX-RS 2.0 adiciona algumas funcionalidades há muito aguardadas, a maioria delas focada no que a Oracle chama de "API simplificada". Essas novas funcionalidades podem ser categorizadas como:

  • API cliente
  • Suporte a chamadas assíncronas
  • HATEOAS (hipermídia)
  • Anotações
  • Validação
  • Filtros e manipuladores
  • Negociação de conteúdo

Falaremos a seguir um pouco sobre cada uma dessas categorias:

API Cliente

A API do JAX-RS 1.0 era voltada estritamente para o lado servidor. Algumas implementações forneceram vários graus de suporte para clientes, mas geralmente o desenvolvedor teve que escolher entre algumas soluções ad hoc, como o HttpClient do projeto Jakarta Commons da Apache, ou o REST Client da WizTools.

O JAX-RS 2.0 adiciona construtores ("builders") para invocar um web service REST a partir do cliente. Veja um exemplo:

 Client client=ClientFactory.newClient();
  String shares=client.target("http://.../portfolio/123")
      .pathParam("identifier", "IBM")
      .queryParameter("identifierType", "ticker")
      .request("text/plain).get(String.class");

Note que esse método primeiramente obtém um cliente e então utiliza o pattern Builder para construir todos os parâmetros da URL, permitindo que o desenvolvedor formule a URL sem lidar com as particularidades de construção de URL.

Essa abordagem é especialmente útil para invocações que contenham um corpo HTTP, como em um POST ou PUT HTTP. No exemplo a seguir é realizada uma chamada POST fictícia para venda de 100 ações da IBM:

Stock stock=client.target("http://.../portfolio/123/sell")
        .pathParam("identifier", "IBM")
        .queryParameter("identifier", "ticker")
        .request("application/json")
        .post(text("100", Shares.class));

Chamadas assíncronas

No JAX-RS 1.0 o cliente tinha que esperar o servidor responder suas chamadas, pois a API suportava apenas requisições síncronas. A versão 2.0 introduz o suporte assíncrono. Isso permite que um cliente faça uma chamada RESTfull e, opcionalmente, obtenha uma referência de Future ou um InvocationCallback, para ser notificada quando a resposta estiver completa.

HATEOAS (Hipermídia)

De acordo com a ortodoxia do REST, se a aplicação não estiver usando HATEOAS, então ela não é REST! O HATEOAS (Hypermedia as the Engine of Application State, ou Hipermídia como Motor de Estado da Aplicação) requer que os produtores e consumidores RESTful concordem com um conjunto de links a serem retornados em cada chamada e usados pelo cliente para navegação. Se o REST for pensado como a versão "aplicação" de uma página web, então o HATEOAS pode ser visto como os links contidos dentro dessa página web.

O JAX-RS 2.0 fornece as classes Link e Target para introduzir hiperlinks dentro da resposta fornecida pelo servidor e reagir a elas no lado cliente.

Anotações

Novas anotações foram introduzidas, como para fornecer suporte de novos tipos de injeção.

Bean Validation

O framework Bean Validation está integrado ao novo JAX-RS, agindo como facilitador para especificar metadados de validação de parâmetros. Por exemplo, a anotação @NotNull indica que o parâmetro anotado não pode ser nulo. É possível também utilizar anotações customizadas para garantir formatos de dados (CEP, telefone, etc).

Filtros e Manipuladores (handlers)

A API de filtros fornece a habilidade de encadear filtros de Servlets, de acordo ao padrão Chain of Responsibility. Isso é útil para implementar funcionalidades ortogonais, como o clássico exemplo de logging. Qualquer filtro pode decidir se deve continuar ou terminar a cadeia ao invocar FilterAction.NEXT ou FilterAction.STOP, respectivamente.

Os handlers (manipuladores) são similares aos filtros, exceto pela capacidade de "embrulhar" (wrap) uma invocação de método em um ponto de extensão especificado, para manipular e enriquecer os dados do corpo da mensagem.

Negociação de conteúdo

Anotações mais ricas agora aceitam construções que permitem priorizar os formatos de request/response.

O JAX-RS ainda carece de um bom modelo de segurança, o que o torna difícil utilizar em aplicações empresariais, que são expostas a clientes externos. Esperamos que a próxima versão forneça suporte para autenticação ponto-a-ponto.

O JAX-RS 2.0 ainda estão em vias de ser suportado pelos principais servidores Java EE. Enquanto isso não acontece, é possível aproveitá-lo imediatamente em sua aplicação, utilizando a última versão do Jersey. A Oracle publicou os passos para fazer isso no WebLogic 12c.

Para mais informações, veja o artigo Java EE 7 e JAX-RS 2.0 escrito pelo membro do expert group da JSR da versão 2.0, Adam Bien.

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Dê sua opinião

Conteúdo educacional

Feedback geral
Bugs
Publicidade
Editorial
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2014 C4Media Inc.
Política de privacidade
BT