with servlet jax example java jersey jax-rs

servlet - web service rest java eclipse



¿Qué significa el Proveedor en JAX-RS? (3)

¿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 entenderla.
Si hay clases de recursos que atienden las solicitudes entrantes, ¿qué hacen los proveedores? ¿En qué se diferencian de las clases de recurso singleton cuando creo una clase de recurso persistente (la que no es por solicitud)? ¿O esas clases también son proveedores?


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, a 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 entre las clases de recursos y la implementación de JAX-RS. Si ayuda, puede pensar en ellos de la misma manera que los controladores de dispositivo (que existen entre el usuario y el espacio del kernel). Esta es una generalización amplia.

Hay tres clases de proveedores definidos por la especificación JAX-RS actual. La característica común entre ellos es que todos los proveedores deben identificarse mediante la anotación @Provider y seguir ciertas reglas para la declaración del constructor. Aparte de eso, 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 los recursos pueden acceder a través de anotaciones @Context.

Proveedores de excepción

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

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 el mapeo hacia y desde XML, la traducción de las excepciones más comunes, 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 (vea el Capítulo 4).


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, debemos implementar las clases apropiadas, especificándolas con la anotación @Provider.

JAX-RS realizará una ronda de exploración para encontrar la existencia de cualquier implementación definida por el usuario al buscar una anotación @Provider.

Por ejemplo:

... @Provider public class AppExceptionMapper implements ExceptionMapper<Throwable> { ... ... @Provider @PreMatching public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter { ...


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 utilizando un 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 a la entidad y que se puede generar mediante la respuesta. ResponseBuilder .

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