¿Qué significa Proveedor en JAX-RS?

110

¿Alguien podría explicarme qué es un proveedor JAX-RS y qué hace la anotación '@Provider'? He estado leyendo documentación pero no puedo conseguirla.
Si hay clases de recursos que atienden las solicitudes entrantes, ¿qué hacen los proveedores? ¿En qué se diferencian de las clases de recursos singleton cuando creo una clase de recurso persistente (la que no es por solicitud)? ¿O esas clases también son proveedores?

Artem Moskalev
fuente
Para acompañar esto: ¿Por qué el documento JAX-RS no explica esto en el primer párrafo del capítulo "Proveedores", la página lógica a la que me dirigí cuando buscaba comprensión? PDF de documentación de JAX-RS
Jonathan Komar

Respuestas:

138

Los proveedores son simplemente una forma de ampliar y personalizar el tiempo de ejecución de JAX-RS. Puede pensar en ellos como complementos que (potencialmente) alteran el comportamiento del tiempo de ejecución, con el fin de lograr un conjunto de objetivos (definidos por el programa).

Los proveedores no son lo mismo que las clases de recursos, existen, conceptualmente, en un nivel intermedio entre las clases de recursos y la implementación JAX-RS. Si ayuda, puede pensar en ellos de la misma manera que los controladores de dispositivo (existentes entre el usuario y el espacio del kernel). Ésta es una generalización amplia.

Hay tres clases de proveedores definidos por la especificación JAX-RS actual. El punto en común entre ellos es que todos los proveedores deben estar identificados por la anotación @Provider y seguir ciertas reglas para la declaración del constructor. Aparte de eso, los diferentes tipos de proveedores pueden tener anotaciones adicionales e implementarán diferentes interfaces.


Proveedores de entidades

Estos proveedores controlan la asignación de representaciones de datos (como XML, JSON, CSV) a sus equivalentes de objetos Java.

Proveedores de contexto

Estos proveedores controlan el contexto al que pueden acceder los recursos a través de las anotaciones @Context.

Proveedores de excepción

Estos proveedores controlan la asignación de excepciones de Java a una instancia de respuesta JAX-RS.


Su tiempo de ejecución vendrá con una serie de proveedores predefinidos que serán responsables de implementar un nivel básico de funcionalidad (por ejemplo, para mapear hacia y desde XML, traducir las excepciones más comunes, etc., etc.). También puede crear sus propios proveedores según sea necesario.

La especificación JAX-RS es una buena referencia para leer sobre estos diferentes tipos de proveedores y lo que hacen (consulte el Capítulo 4).

Percepción
fuente
Gracias. Creo que tengo la idea de la cosa =)
Artem Moskalev
Bien explicado @Perception. Esto realmente ayudó en mi comprensión.
L-Samuels
Bien explicado. Sin embargo, una pregunta: ¿en qué se diferencian las implementaciones de @provider de una implementación de la interfaz javax.ws.rs.core.Feature inyectada a través del parámetro init (jersey.config.server.provider.classnames) en web.xml? ¿Cómo se controla el pedido?
Andy Dufresne
Tenga en cuenta la última versión de la especificación JAX-RS (versión 2.1, versión final el 13 de julio de 2017) download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar
13

La anotación @Provider se usa para cualquier cosa que sea de interés para el tiempo de ejecución de JAX-RS , como MessageBodyReader y MessageBodyWriter . Para las solicitudes HTTP, MessageBodyReader se utiliza para asignar un cuerpo de entidad de solicitud HTTP a los parámetros del método. En el lado de la respuesta, un valor de retorno se asigna a un cuerpo de entidad de respuesta HTTP mediante MessageBodyWriter. Si la aplicación necesita proporcionar metadatos adicionales, como encabezados HTTP o un código de estado diferente, un método puede devolver una Respuesta que envuelve la entidad y que se puede construir usando Response. ResponseBuilder .

La anotación @Provider le brinda la capacidad de examinar los mensajes entrantes y salientes en el nivel XML sin procesar y, de esta manera, el Proveedor es la contraparte de Dispatch en el cliente.

UN JEFE
fuente
6

Para realizar ciertas actividades como Filtrado-Solicitud / Respuesta, Manejo de excepciones, el JAX-RS tiene su propia lógica de implementación predeterminada. Sin embargo, también permite a los usuarios proporcionar su propia implementación.

Para proporcionar nuestra propia implementación, necesitamos implementar las clases apropiadas especificándolas con la anotación @Provider.

JAX-RS hará una ronda de escaneo para encontrar la existencia de cualquier implementación definida por el usuario buscando la anotación @Provider.

Por ejemplo:

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

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