O que significa Provedor em JAX-RS?

110

Alguém poderia me explicar o que é um Provedor JAX-RS e o que a anotação '@Provider' faz? Tenho lido a documentação, mas não consigo entender.
Se houver classes de recursos que atendem às solicitações de entrada, o que os provedores fazem? Como eles são diferentes das classes de recursos singleton quando eu crio uma classe de recurso persistente (aquela que não é por solicitação)? Ou essas aulas também são provedores?

Artem Moskalev
fonte
Para continuar com isso: Por que o documento JAX-RS não explica isso no primeiro parágrafo do capítulo "Provedores" - a página lógica para a qual virei ao procurar entender. JAX-RS Documentation PDF
Jonathan Komar

Respostas:

138

Os provedores são uma forma simples de estender e personalizar o tempo de execução JAX-RS. Você pode pensar neles como plug-ins que (potencialmente) alteram o comportamento do tempo de execução, a fim de cumprir um conjunto de objetivos (definidos pelo programa).

Os provedores não são iguais às classes de recursos, eles existem, conceitualmente, em um nível intermediário entre as classes de recursos e a implementação JAX-RS. Se ajudar, você pode pensar neles da mesma forma que os drivers de dispositivo (existentes entre o usuário e o espaço do kernel). Esta é uma ampla generalização.

Existem três classes de provedores definidas pela especificação JAX-RS atual. A semelhança entre eles é que todos os provedores devem ser identificados pela anotação @Provider e seguir certas regras para a declaração do construtor. Além disso, diferentes tipos de provedor podem ter anotações adicionais e implementarão diferentes interfaces.


Provedores de Entidade

Esses provedores controlam o mapeamento de representações de dados (como XML, JSON, CSV) para seus equivalentes de objeto Java.

Provedores de Contexto

Esses provedores controlam o contexto que os recursos podem acessar por meio de anotações @Context.

Provedores de exceção

Esses provedores controlam o mapeamento de exceções Java para uma instância de resposta JAX-RS.


Seu tempo de execução virá com vários provedores predefinidos que serão responsáveis ​​por implementar um nível básico de funcionalidade (por exemplo, para mapear de e para XML, traduzir as exceções mais comuns etc etc). Você também pode criar seus próprios provedores conforme necessário.

A especificação JAX-RS é uma boa referência para ler esses diferentes tipos de provedores e o que eles fazem (consulte o Capítulo 4).

Percepção
fonte
Obrigado. Acho que peguei a ideia da coisa =)
Artem Moskalev
Bem explicado @Perception. Isso realmente ajudou na minha compreensão.
L-Samuels
Bem explicado. No entanto, uma questão - como as implementações de @provider são diferentes de uma implementação da interface javax.ws.rs.core.Feature injetada por meio do parâmetro init (jersey.config.server.provider.classnames) em web.xml? Como o pedido é controlado?
Andy Dufresne
Observe a versão mais recente da especificação JAX-RS (Versão 2.1 Lançamento final em 13 de julho de 2017) download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar
13

A anotação @Provider é usada para qualquer coisa que seja de interesse para o tempo de execução JAX-RS , como MessageBodyReader e MessageBodyWriter . Para solicitações HTTP, o MessageBodyReader é usado para mapear um corpo de entidade de solicitação HTTP para parâmetros de método. No lado da resposta, um valor de retorno é mapeado para um corpo de entidade de resposta HTTP usando um MessageBodyWriter. Se o aplicativo precisar fornecer metadados adicionais, como cabeçalhos HTTP ou um código de status diferente, um método pode retornar uma Resposta que envolve a entidade e que pode ser construída usando Resposta. ResponseBuilder .

A anotação @Provider dá a você a capacidade de examinar as mensagens de entrada e saída no nível XML bruto e, dessa forma, o Provedor é a contraparte do Dispatch no cliente.

UM CHEFE
fonte
6

Para fazer certas atividades, como Filtragem-Solicitação / Resposta, Tratamento de Exceções, o JAX-RS possui sua própria lógica de implementação padrão. No entanto, ele permite que os usuários forneçam sua própria implementação também.

Para fornecer nossa própria implementação, precisamos implementar as classes apropriadas especificando-as com a anotação @Provider.

O JAX-RS fará uma rodada de varredura para encontrar a existência de qualquer implementação definida pelo usuário, buscando a anotação @Provider.

Por exemplo:

...
@Provider
public class AppExceptionMapper implements ExceptionMapper<Throwable> {
...

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
maris
fonte