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


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

3 73

3 ответа:

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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

например:

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

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