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