JHipster - Produtividade e Maturidade em suas mãos
JAX-RS 2.0
1. JAX-RS 2.0
As novidades do padrão para desenvolvimento REST
Fabio Velloso
Wednesday, September 18, 13
2. Fabio Velloso
• Bacharel em Ciência da Computação pela Universidade Federal
de São Carlos - UFSCar
• Fundador do SouJava
• Desenvolvendo projetos com tecnologia Java desde 96
• Professor de SOA e Web Services do curso de Pós-Graduação
"Lato-Sensu" em Desenvolvimento de Software para Web da
UFSCar
• Gerente de Arquitetura da Telefonica | VIVO
• Atualmente desenvolve projetos pessoais com Big Data, Cloud,
Design Thinking, Service Design e Economia Criativa
Wednesday, September 18, 13
3. Agenda
• REST
• Conceitos
• JAX-RS
• Conceitos e principais anotações
• JAX-RS 2.0
• Novidades
Wednesday, September 18, 13
4. Agenda
• REST
• Conceitos
• JAX-RS
• Conceitos e principais anotações
• JAX-RS 2.0
• Novidades
Wednesday, September 18, 13
5. REST
• Estilo de arquitetura e suas restrições
• Recursos identificados unicamente por uma URI
• Interface uniforme (GET, POST, PUT, DELETE)
• Componentes REST manipulam recursos alterando sua
representação
• Mensagens auto-descritivas e sem estado ou “stateless”
• Informações podem estar em cache
• Multiplas representações
• Hypermedia
Wednesday, September 18, 13
6. Aplicação CRUD com REST
• Consultar o livro por seu ID
GET http://www.soujava.org.br/books/123
• Adicionar um livro
POST http://www.soujava.org.br/books
• Alterar um livro
PUT http://www.soujava.org.br/books
• Remover o livro pelo ID
DELETE http://www.soujava.org.br/books/123
Wednesday, September 18, 13
8. Aplicação CRUD com REST
<book>
<id>123</id>
<name>Java: The Good Parts </name>
<author>Jim Waldo</author>
<isbn>0596803737</isbn>
<isbn13>978-0596803735</isbn13>
</book>
Wednesday, September 18, 13
9. Agenda
• REST
• Conceitos
• JAX-RS
• Conceitos e principais anotações
• JAX-RS 2.0
• Novidades
Wednesday, September 18, 13
10. Java API for RESTful Web Services - JSR 331
• Suporte a RESTful em Java
• API padronizada
• Programação declarativa
• Anotações
• POJO
• Integrado ao JEE6 (JSR 313)
Wednesday, September 18, 13
11. Java API for RESTful Web Services - JSR 331
Wednesday, September 18, 13
12. Java API for RESTful Web Services - JSR 331
Recurso
Recurso
Wednesday, September 18, 13
13. Java API for RESTful Web Services - JSR 331
Recurso
Recurso
Método HTTP
Wednesday, September 18, 13
14. Java API for RESTful Web Services - JSR 331
Recurso
Recurso
Método HTTP
Serialização
Serialização
Wednesday, September 18, 13
15. Java API for RESTful Web Services - JSR 331
• @Path, @PathParam, @Produces, @Consumes
@HeaderParam, @QueryParam, @MatrixParam
@NewCookie
Recurso
Recurso
Método HTTP
Serialização
Serialização
Wednesday, September 18, 13
16. Agenda
• REST
• Conceitos
• JAX-RS
• Conceitos e principais anotações
• JAX-RS 2.0
• Novidades
Wednesday, September 18, 13
17. JAX-RS 2.0 Java API for RESTful Web Services
• JSR 339
• Client API
• Validação
• Filters e Interceptors
• Processamento assíncrono
• Melhorias
• ResourceTemplate
• Link
JAX-RS 2.0JCP JAVA
EXTRA!!
Wednesday, September 18, 13
18. Client API
• Objetivos:
• Encapsular os conceitos e principais restrições da
arquitetura REST como artefatos Java em clientes
• Facilitar o consumo de RESTfull Web Services
• como JAX-RS facilitou desenvolvimento no servidor
• Compartilhar conceitos comuns entre client e server
JAX-RS
Wednesday, September 18, 13
19. Client API
• Padronização da API client
• Portável entre implementações
• Consumo de Web Services expostos sobre HTTP
• Pode acessar serviços REST construídos em outras
linguagens e frameworks
• ou acessar extensões como Web Dav
• Setar parâmetros e configurações
• Form, headers, SSL
Wednesday, September 18, 13
20. Client API
• Classes e interfaces mais importantes
• Client
• Usada para criar e acessar “web resources” e
configurar propriedades de conexões e requisições
• ClientBuilder.newClient();
• WebTarget
• encapsula um Web resource
• podendo criar e envia-lo requests e processar seus
responses
• .get() , .post() , .put() , .delete()
Wednesday, September 18, 13
21. Client API
• Client API com todos objetos
• Fluent API
Wednesday, September 18, 13
22. Client API
• Invocation
• Requisição preparada e pronta a ser executada
• Interface genérica (command) com clara separação de
conceitos:
• Creator - cria a requisição
• Submitter - envia a requisição
• Não precisa conhecer como o “Invocation” é
preparado e sim quando e como ele é executado
• Forma síncrona
• Forma assíncrona
Wednesday, September 18, 13
24. Client API
• Setar parâmetros do request
• “fluent” api
• Form
Wednesday, September 18, 13
25. Client API
• Setar parâmetros do request
• “fluent” api
• Form
Objeto JAXB
Wednesday, September 18, 13
26. Validation
• Verifica o conteúdo e formação de um ou mais campos
• Utiliza Beans Validation
• Suporte por anotações de validação em:
• Campos e propriedades
• Métodos (response entities)
• Resource classes
• Parâmetros (inclusive request entity)
• lança javax.validation.ValidationException
Wednesday, September 18, 13
27. Validation
• @NotNull
• Varifica se o campo é nulo
• se nulo javax.validation.ValidationException
Wednesday, September 18, 13
28. Validation
• @NotNull
• Varifica se o campo é nulo
• se nulo javax.validation.ValidationException
Wednesday, September 18, 13
29. Validation
• Aplicável a campos
@Path("/")
public class UserResource {
@NotNull
@FormParam("userName")
private String userName;
• Aplicável a métodos
@NotNull
@FormParam("userName")
public void setUserName(String userName) {
this.username = userName;
}
Wednesday, September 18, 13
30. Validation
• Aplicável a recursos
@Path("/createUser")
@PhoneRequired
public class CreateUserResource {
@FormParam("homePhone")
private Phone homePhone;
@FormParam("mobilePhone")
private Phone mobilePhone;
}
Wednesday, September 18, 13
31. Validation
• @Pattern com expressões regulares
• javax.validation.constraints.Pattern
• Erro - HTTP Status 400 - Bad Request
Wednesday, September 18, 13
32. Validation
• @Valid
• valida no método classes que tem “constraints”
public class Book {
private int id;
@NotNull
private String name; ...}
@POST
@Consumes(MediaType.APPLICATION_XML)
public void createBook(@Valid BookConstraints book) {
//Executa criacão }
• Erro na validação (ValidationException) retorna
• HTTP 400 ou HTTP 500
Wednesday, September 18, 13
33. Validation
• Custom Validation
• Validação definida pelo desenvolvedor
• Implementar a interface ConstraintValidator
Wednesday, September 18, 13
34. Filters
• Utilizados para modificar requests e responses
• Adicionar e/ou alterar headers
• Filtros podem ser server side e/ou client side
• ContainerRequestFilter
• ContainerResponseFilter
• ClientResponseFilter
• ClientRequestFilter
Wednesday, September 18, 13
35. ContainerResponseFilters
• Utilizado para modificar response
• alterando Headers
• Classe tem de implementar ContainerResponseFilter
• Filtros são aplicados globalmente em todos recursos da
aplicação por padrão
Wednesday, September 18, 13
36. ContainerResponseFilters
• Filtros por padrão são chamados de globais
• e aplicados a todos os recursos da aplicação
• Anotação @NameBinding
• Altera o comportamento padrão
• Especifica a quais recursos o filtro é aplicado
• Filtros com essa característica são chamados name-bound
Wednesday, September 18, 13
37. @NameBinding - passos
• Definir a Interface e anotação
• Definir e anotar a classe com @Provider e @<nome>
Wednesday, September 18, 13
38. @NameBinding - passos
• Anotar os recursos para o filtro
• Todos os flitros são executados como pos matching
• Executados após selecionar qual método deve ser acessado
para cada request
• Pode ser alterado usando a anotação @PreMatching
• são executados antes do iniciar o “matching”
Wednesday, September 18, 13
39. ContainerRequestFilters
• Similares aos ResponseFilters
• Possibilitam alteram os parâmetros do request
• Não possuem parâmetro ContainerResponseContext
• RequestFilters são executados como post-matching
• executados após o recurso a ser executado ser
“encontrado”
• GET, POST, PUT ou DELETE
• Pode-se alterar utilizando a anotação @PreMatching
• executa o filtro antes do “matching” do método
Wednesday, September 18, 13
41. Interceptors
• Manipular input/output streams
• Podem ser utilizados no cliente ou server
• Dois tipos de Interceptors
• ReaderInterceptors (manipulam stream de entrada)
• WriterInterceptors (manipulam streams de saída)
• Interceptors são globais (aplicados a todos os recursos)
• Anotação @NameBinding (name-bound)
• Especifica a quais recursos o filtro é aplicado
Wednesday, September 18, 13
43. Asynchronous Processing
• Possibilita o processamento multithread no servidor,
aumentando o seu throughput
• Libera a thread do servidor para executar outras tarefas
• Processamento executa em outra thread ou espera em
uma fila até execução
• Quando recebe a resposta envia para o client
• @Suspended indica que o método será executado de
maneira assíncrona
• Possível setar timeout, portanto faça!
Wednesday, September 18, 13
56. Asynchronous Processing
• Cliente assíncrono
• Arquiteturas fracamente acopladas
Define a
execução
assíncrona
Wednesday, September 18, 13
57. Asynchronous Processing
• Cliente assíncrono
• Arquiteturas fracamente acopladas
Define a
execução
assíncrona
Representa o
resultado de
processamento
assíncrono
Wednesday, September 18, 13
58. Asynchronous Processing
• Cliente assíncrono
• Arquiteturas fracamente acopladas
Define a
execução
assíncrona
Representa o
resultado de
processamento
assíncrono
Wednesday, September 18, 13
59. JAX-RS 2.0
• Novas funcionalidades para “build” de URIs
• Possibilida de uso de “templates” na classe UriBuilder
• método resolveTemplate()
• Resultado:
• http://www.thedevelopersconference.com.br/2013?
trilha=JavaEE
Wednesday, September 18, 13
60. JAX-RS 2.0
• Classe Link
• Implementa RFC 5988 (Web Link)
• Inserir metadados em mensagens HTTP
• Link é serializado em um HTTP Response como um header
HTTP
• Representa um link hypermedia
Wednesday, September 18, 13
61. Richardson Maturity Model
• Nível 0
• POX
• URI única
• Nível 1
• URIs, verbo único
• Nível 2
• CRUD
• URIs, verbos
• Nível 3
• Hypermedia
• RESTful Service POX
Recursos
Verbos HTTP
Controles
Hypermedia
Wednesday, September 18, 13
62. Hypermedia
• Links para declarar próximos passos
• Links para descrever transições de estado
• Navegação altera estado do recurso
• Máquina de estados e workflow
• XHTML, ATOM , JSON
Wednesday, September 18, 13
63. JAX-RS 2.0
• Link
• adicionando links a um objeto Response
• Consumindo em um cliente
Wednesday, September 18, 13