Какие объекты можно вводить с помощью аннотации @Context?
Я новичок в JAX-RS, и я пытаюсь понять, как должна работать аннотация @Context
.
В javadoc есть список из шести классов (Application
, UriInfo
, Request
, HttpHeaders
, SecurityContext
, Providers
). Однако я нахожу код в Интернете, который использует эту аннотацию для других типов, например:
@GET
public String something(@Context HttpServletRequest req) {
}
Есть ли список поддерживаемых типов, которые можно использовать с этими аннотациями? Изменяется ли этот список между внедрением стандарта?
Я сейчас экспериментирую с Джерси, и я беспокоюсь, что напишу код, который нельзя портировать на другую реализацию JAX-RS.
Ответы
Ответ 1
Клепки JAX-RS спецификация определяет все стандартные типы вы можете инъекционные через @Context
.
Но если бы я был вами, я просто проконсультируюсь с конкретной документацией выбранного вами провайдера, чтобы узнать, что доступно.
Например, RESTEasy предоставляет эти значения через @Context
. Тем временем Джерси предоставляет их. Очевидно, что будут перекрываться из-за стандартных значений контекста.
Ответ 2
Аннотация @Context
позволяет вам вводить детали контекста запроса/ответа в JAX-RS провайдер и классы ресурсов. Инжекция может быть выполнена в поле класса, свойство компонента или параметр метода.
В следующем списке перечислены все типы, которые могут быть введены с использованием аннотации @Context
соответствии со спецификацией JAX-RS 2.0:
За исключением Configuration
и Providers
, которые можно вводить как в клиентских, так и в серверных поставщиках, все остальные типы являются только серверными.
Следующие типы доступны только при развертывании приложения в контейнере сервлета:
JAX-RS 2.1 представил другие типы, которые могут быть @Context
с помощью @Context
:
Помимо стандартных типов, перечисленных выше, реализации JAX-RS, такие как Jersey, RESTEasy и Apache CXF, могут определять свои собственные типы, которые можно вводить с помощью @Context
.
Ниже приведено краткое описание каждого типа JAX-RS, доступного для инъекций:
-
Приложение: экземпляр предоставленного Application
подкласса Application
может быть введен в поле класса или параметр метода. Доступ к экземпляру подкласса Application
позволяет централизовать информацию о конфигурации в этом классе.
-
URI и шаблоны URI: UriInfo
предоставляет как статическую, так и динамическую информацию для каждого запроса о компонентах URI запроса.
-
Заголовки: HttpHeaders
предоставляет доступ к информации заголовка запроса либо в форме карты, либо с помощью строго типизированных удобных методов. Заголовки ответа могут быть предоставлены с использованием класса Response
.
-
Согласование содержимого и предварительные условия. Методы Request
позволяют вызывающей стороне определять вариант представления наилучшего соответствия и оценивать, соответствует ли текущее состояние ресурса любым предварительным условиям в запросе.
-
Контекст SecurityContext
Интерфейс SecurityContext
обеспечивает доступ к информации о контексте безопасности текущего запроса. Методы SecurityContext
обеспечивают доступ к субъекту текущего пользователя, информацию о ролях, выполняемых запрашивающей стороной, поступил ли запрос по безопасному каналу и используется схема аутентификации.
-
Провайдеры: интерфейс Providers
позволяет искать экземпляры провайдеров на основе набора критериев поиска. Ожидается, что этот интерфейс будет в первую очередь интересен авторам провайдеров, желающим использовать функциональность других провайдеров. Это инъецируется как в клиентских, так и в серверных провайдерах.
-
Контекст ResourceContext
Интерфейс ResourceContext
обеспечивает доступ к реализации и инициализации классов ресурсов или подресурсов в области по умолчанию для каждого запроса. Он может быть введен для помощи в создании и инициализации или просто инициализации экземпляров, созданных приложением.
-
Конфигурация: Как клиент и сервер во время выполнения Configuration
доступны для инъекции поставщиков (клиент или сервер) и классов ресурсов (только для сервера).
-
События SSE: SseEventSink
представляет входящее соединение SSE и предоставляет методы для отправки событий. Sse
предоставляет фабричные методы для событий и вещателей.
Этот пост, написанный Арджаном Тиймсом, предполагает, что будущие версии JAX-RS могут иметь более тесную интеграцию с CDI. Таким образом, @Context
может быть устаревшим, а затем удален в пользу @Inject
:
JAX-RS 2.2
По какой-то причине, которая в значительной степени была потеряна во времени, JAX-RS использует свою собственную систему внедрения зависимостей, основанную на @Context
а не CDI @Inject
. Хотя JAX-RS был обновлен в последний момент перед его первоначальным выпуском, чтобы иметь некоторый уровень поддержки CDI, тот факт, что ресурсы JAX-RS не являются бобами CDI, излишне сдерживает спецификацию и вызывает путаницу, даже когда JAX-RS был введен в EE 6 (2009).
Это переключение на CDI может произойти в 2 этапа; в JAX-RS 2.2 все, что теперь может быть введено с помощью @Context
также должно быть @Inject
с использованием @Inject
а ресурсы JAX-RS по умолчанию будут компонентами CDI (возможно, если явно не отключено). В то же время @Context
будет устаревшим. В JAX-RS 3.0 @Context
будет фактически удален.
Ответ 3
Аннотацию @Context можно использовать для ввода 12 объектов. Вот краткое изложение каждого из них.
- HttpHeaders - значения и параметры заголовка HTTP
- UriInfo - параметры запроса URL и переменные пути
- SecurityContext - предоставляет доступ к данным, связанным с безопасностью, для данного HTTP-запроса.
- Запрос - разрешает обработку запроса предварительных условий
- ServletConfig - ServletConfig
- ServletContext - ServletContext
- HttpServletRequest - экземпляр HttpServletRequest для запроса
- HttpServletResponse - экземпляр HttpServletResponse
- Приложение, конфигурация и поставщики → Предоставьте информацию о приложении, конфигурации и поставщиках JAX-RS.
- ResourceContext - предоставляет доступ к экземплярам класса ресурсов
Все эти экземпляры могут быть введены в метод ресурса
@Path("/")
public class EndpointResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getAllHttpHeaders(final @Context HttpHeaders httpHeaders){
// Code here that uses httpHeaders
}
}
или как поле:
@Path("/")
public class EndpointResource {
private final @Context HttpHeaders httpHeaders;
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getAllHttpHeaders(){
// Code here that uses httpHeaders
}
}
Вот серия из пяти частей, отвечая на вопрос Что используется @Conext для?