Может ли кто-нибудь объяснить мне, что такое JAX-RS Provider и что такое аннотация @Provider. Я читал документацию, но я не могу ее получить.
Если есть классы ресурсов, которые обслуживают входящие запросы, что делают провайдеры? Чем они отличаются от одноуровневых классов ресурсов, когда я создаю постоянный класс ресурсов (тот, который не предназначен для запроса)? Или эти классы также являются поставщиками?
Что означает провайдер в JAX-RS?
Ответ 1
Провайдеры - это просто способ расширения и настройки среды выполнения JAX-RS. Вы можете думать о них как о плагинах, которые (потенциально) изменяют поведение среды выполнения, чтобы выполнить набор целей (определенных программой).
Провайдеры не совпадают с классами ресурсов, они существуют, концептуально, на уровне между классами ресурсов и реализацией JAX-RS. Если это помогает, вы можете думать о них в том же свете, что и драйверы устройств (существующие между пользователем и пространством ядра). Это широкое обобщение.
Существует три класса поставщиков, определенных текущей спецификацией JAX-RS. Общность между ними заключается в том, что все поставщики должны быть идентифицированы аннотацией @Provider и следовать определенным правилам для объявления конструктора. Кроме того, разные типы провайдеров могут иметь дополнительные аннотации и будут реализовывать различные интерфейсы.
Поставщики сущ.
Эти поставщики контролируют сопоставление представлений данных (например, XML, JSON, CSV) с их эквивалентами объектов Java.
Контекстные провайдеры
Эти поставщики контролируют контекст, доступ к которому могут получить ресурсы через аннотации @Context.
Поставщики исключений
Эти поставщики управляют отображением исключений Java в экземпляр JAX-RS Response.
В вашей среде исполнения будет множество предопределенных поставщиков, которые будут отвечать за реализацию базового уровня функциональности (например, для сопоставления и из XML, перевода наиболее распространенных исключений и т.д. и т.д.). Вы также можете создать своих собственных поставщиков по мере необходимости.
спецификация JAX-RS является хорошей ссылкой для чтения этих разных типов поставщиков и того, что они делают (см. главу 4).
Ответ 2
Аннотация @Provider используется для всего, что представляет интерес для JAX-RS runtime, например MessageBodyReader и MessageBodyWriter. Для HTTP-запросов MessageBodyReader используется для сопоставления тела объекта запроса HTTP с параметрами метода. На стороне ответа возвращаемое значение отображается в тело объекта ответа HTTP с помощью MessageBodyWriter. Если приложение должно поставлять дополнительные метаданные, такие как заголовки HTTP или другой код состояния, метод может возвращать ответ, который обертывает объект и который может быть создан с помощью Response. ResponseBuilder.
@Provider дает вам возможность проверять входящие и исходящие сообщения на необработанном уровне XML, и таким образом поставщик является партнером отправки на клиенте.