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?
110
Respostas:
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).
fonte
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.
fonte
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:
fonte