Что означает Provider in JAX-RS?

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

3 ответов


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

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

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


сущность Поставщики

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

Контекст Поставщиков

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

- Провайдеров Исключением

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


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

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


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

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


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

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

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

например:

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

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