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