Что означает "провайдер" в JAX-RS?

110

Может ли кто-нибудь объяснить мне, что такое поставщик JAX-RS и что делает аннотация @Provider? Я читал документацию, но не могу ее понять.
Если есть классы ресурсов, обслуживающие входящие запросы, что делают провайдеры? Чем они отличаются от одноэлементных классов ресурсов, когда я создаю постоянный класс ресурсов (тот, который не соответствует запросу)? Или эти классы тоже провайдеры?

Артем Москалев
источник
Чтобы согласиться с этим: почему документ JAX-RS не объясняет это в первом абзаце главы «Провайдеры» - логической странице, к которой я обратился, когда искал понимания. Документация JAX-RS в формате PDF
Джонатан Комар

Ответы:

138

Провайдеры - это просто способ расширения и настройки среды выполнения JAX-RS. Вы можете думать о них как о надстройках, которые (потенциально) изменяют поведение среды выполнения для достижения набора (определенных программой) целей.

Провайдеры - это не то же самое, что классы ресурсов, они концептуально существуют на уровне между классами ресурсов и реализацией JAX-RS. Если это помогает, вы можете рассматривать их в том же свете, что и драйверы устройств (существующие между пространством пользователя и ядра). Это широкое обобщение.

Текущая спецификация JAX-RS определяет три класса поставщиков. Общность между ними заключается в том, что все поставщики должны быть идентифицированы аннотацией @Provider и следовать определенным правилам для объявления конструктора. Кроме того, разные типы поставщиков могут иметь дополнительные аннотации и реализовывать разные интерфейсы.


Провайдеры сущностей

Эти поставщики управляют отображением представлений данных (таких как XML, JSON, CSV) на их эквиваленты объекта Java.

Провайдеры контекста

Эти поставщики управляют контекстом, к которому ресурсы могут получить доступ через аннотации @Context.

Провайдеры исключений

Эти поставщики управляют отображением исключений Java в экземпляр ответа JAX-RS.


Ваша среда выполнения будет поставляться с рядом предопределенных поставщиков, которые будут отвечать за реализацию базового уровня функциональности (например, за отображение в XML и обратно, перевод наиболее распространенных исключений и т. Д.). При необходимости вы также можете создавать своих собственных провайдеров.

Спецификация JAX-RS - хороший справочник по этим различным типам поставщиков и их функциям (см. Главу 4).

Восприятие
источник
Спасибо. Думаю, я уловил эту идею =)
Артем Москалев
Хорошо объяснил @Perception. Это действительно помогло мне понять.
L-Samuels
Хорошо объяснено. Однако один вопрос - чем реализации @provider отличаются от реализации интерфейса javax.ws.rs.core.Feature, введенного через параметр init (jersey.config.server.provider.classnames) в web.xml? Как контролируется заказ?
Энди
Обратите внимание на последнюю версию спецификации JAX-RS (версия 2.1, финальный выпуск 13 июля 2017 г.) download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar
13

@Provider аннотации используются для всего , что представляет интерес для JAX-RS среды исполнения , таких как MessageBodyReader и MessageBodyWriter . Для HTTP-запросов MessageBodyReader используется для сопоставления тела объекта HTTP-запроса с параметрами метода. На стороне ответа возвращаемое значение сопоставляется с телом объекта HTTP-ответа с помощью MessageBodyWriter. Если приложению необходимо предоставить дополнительные метаданные, такие как заголовки HTTP или другой код состояния, метод может вернуть Response, который обертывает сущность и который может быть построен с помощью Response. ResponseBuilder .

Аннотация @Provider дает вам возможность проверять входящие и исходящие сообщения на уровне необработанного XML, и, таким образом, Provider является аналогом Dispatch на клиенте.

БОСС
источник
6

Для выполнения определенных действий, таких как фильтрация-запрос / ответ, обработка исключений, JAX-RS имеет собственную логику реализации по умолчанию. Однако он также позволяет пользователям предоставлять свою собственную реализацию.

Чтобы предоставить нашу собственную реализацию, нам нужно реализовать соответствующие классы, указав их с помощью аннотации @Provider.

JAX-RS выполнит цикл сканирования, чтобы найти наличие любой такой пользовательской реализации, путем поиска аннотации @Provider.

Например:

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

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
Марис
источник