Подтвердить что ты не робот

Какие объекты можно вводить с помощью аннотации @Context?

Я новичок в JAX-RS, и я пытаюсь понять, как должна работать аннотация @Context.

В javadoc есть список из шести классов (Application, UriInfo, Request, HttpHeaders, SecurityContext, Providers). Однако я нахожу код в Интернете, который использует эту аннотацию для других типов, например:

@GET
public String something(@Context HttpServletRequest req) {

}

Есть ли список поддерживаемых типов, которые можно использовать с этими аннотациями? Изменяется ли этот список между внедрением стандарта?

Я сейчас экспериментирую с Джерси, и я беспокоюсь, что напишу код, который нельзя портировать на другую реализацию JAX-RS.

4b9b3361

Ответ 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 для?