Що означає Провайдер у JAX-RS?


110

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


Щоб продовжити це: Чому документ JAX-RS не пояснює це в першому параграфі глави "Постачальники" - логічній сторінці, на яку я звернувся, коли шукав розуміння. PDF Документація JAX-RS
Джонатан Комар

Відповіді:


138

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

Постачальники - ні такі, як класи ресурсів, вони існують концептуально на рівні між класами ресурсів та реалізацією JAX-RS. Якщо це допомагає, ви можете розглядати їх у такому ж світлі, що і драйвери пристроїв (наявні між користувачем та простором ядра). Це широке узагальнення.

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


Суб'єктні провайдери

Ці провайдери контролюють відображення представлених даних (наприклад, XML, JSON, CSV) на їх об'єктивні еквіваленти Java.

Контекстні провайдери

Ці провайдери контролюють контекст, до якого ресурси можуть отримати доступ через примітки @Context.

Постачальники винятків

Ці провайдери контролюють відображення виключень Java на екземпляр реакції JAX-RS.


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

Специфікація JAX-RS є хорошою орієнтиром для ознайомлення з різними типами постачальників та тим, що вони роблять (див. Розділ 4).


Дякую. Думаю, я зрозумів річ =)
Артем Москальов

Добре пояснено @ Прийняття. Це справді допомогло в моєму розумінні.
L-Samuels

Добре пояснено. Хоча одне питання - чим відрізняються реалізації @provider від реалізації javax.ws.rs.core.Feature інтерфейсу через параметр init (jersey.config.server.provider.classnames) у web.xml? Як контролюється замовлення?
Енді Дуфресне

Зверніть увагу на останню версію специфікації JAX-RS (версія 2.1 Final Release 13 липня 2017) download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec / ...
burntsugar

13

@Provider анотації використовуються для всього , що становить інтерес для JAX-RS середовища виконання , таких як MessageBodyReader і MessageBodyWriter . Для HTTP-запитів MessageBodyReader використовується для зіставлення тіла об'єкта запиту HTTP з параметрами методу. З боку відповіді, повернене значення відображається в тіло об'єкта відповіді HTTP за допомогою MessageBodyWriter. Якщо програмі потрібно надати додаткові метадані, такі як заголовки HTTP або інший код статусу, метод може повернути Response, який обертає сутність і який може бути побудований за допомогою Response. ResponseBuilder .

Анотація @Provider надає вам можливість перевіряти вхідні та вихідні повідомлення на необробленому рівні XML, і таким чином Провайдер є аналогом відправки на клієнті.


6

Для виконання певних заходів, таких як фільтрування-запит / відповідь, обробка виключень, JAX-RS має власну логіку реалізації за замовчуванням. Однак це дозволяє користувачам також надавати їх власну реалізацію.

Для забезпечення власної реалізації нам потрібно реалізувати відповідні класи, вказавши їх з анотацією @Provider.

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

Наприклад:

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

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.