我可以使用@Context注释注入哪些对象?

时间:2014-01-05 18:22:08

标签: java jersey jax-rs

我是JAX-RS的新手,我正在尝试理解@Context注释应该如何工作。

javadoc,有一个包含六个班级的列表(ApplicationUriInfoRequestHttpHeadersSecurityContext,{{ 1}})。但是我在Web上找到了使用此注释与其他类型的代码,例如:

Providers

是否有可用于此注释的受支持类型列表?此列表是否在标准的实施之间发生变化?

我正在尝试使用Jersey,我担心我会编写无法移植到其他JAX-RS实现的代码。

4 个答案:

答案 0 :(得分:39)

@Context注释允许您将请求/响应上下文详细信息注入JAX-RS提供程序和资源类。可以在类字段 bean属性方法参数中执行注入。

以下列表根据@Context总结了使用JAX-RS 2.0 specification注释可以注入的所有类型:

ConfigurationProviders除外 可以在客户端和服务器端提供程序中进行注入,所有其他类型都只是服务器端

当应用程序部署在servlet容器中时,以下类型仅

JAX-RS 2.1介绍了可以使用@Context注入的其他类型:

除了上面列出的标准类型之外,JAX-RS实现(例如JerseyRESTEasyApache CXF)可能会定义自己的类型,可以使用@Context注入

下面简要介绍每种可用于注射的JAX-RS类型:

  • 应用程序:可以将应用程序提供的Application子类的实例注入到类字段或方法参数中。访问Application子类实例允许将配置信息集中在该类中。

  • URI和URI模板: UriInfo提供有关请求URI组件的静态和动态每请求信息。

  • 标题: HttpHeaders以地图形式或强类型便捷方法提供对请求标头信息的访问。可以使用Response类提供响应标头。

  • 内容协商和前置条件Request的方法允许调用者确定最佳匹配的表示形式,并评估资源的当前状态是否与任何先决条件相匹配请求。

  • 安全上下文: SecurityContext界面提供对当前请求的安全上下文信息的访问。 SecurityContext的方法提供对当前用户主体的访问,请求者假定的角色信息,请求是否通过安全通道到达,以及使用的身份验证方案。

  • 提供商: Providers界面允许根据一组搜索条件查找提供者实例。预期该接口主要是希望使用其他提供者功能的提供者作者感兴趣的。它可以在客户端和服务器提供商中进行注入。

  • 资源上下文: ResourceContext接口提供对默认的每请求范围内的资源或子资源类的实例化和初始化的访问。可以注入它来帮助创建和初始化,或者只是初始化应用程序创建的实例。

  • 配置:客户端和服务器运行时Configuration都可以在提供程序(客户端或服务器)和资源类(仅限服务器)中注入。

  • SSE事件: SseEventSink表示传入的SSE连接,并提供发送事件的方法。 Sse为活动和广播公司提供工厂方法。

post撰写的Arjan Tijms表明未来版本的JAX-RS 可能与CDI更强大的集成。因此,可以弃用@Context,然后将其移除,以支持@Inject

  

JAX-RS 2.2

     

出于某种原因,JAX-RS基本上在@Context而不是CDI的@Inject使用了自己的依赖注入系统。虽然JAX-RS在其最初版本发布之前的最后一刻得到了更新,以便对CDI提供一定程度的支持,但JAX-RS资源不是CDI bean的事实已经不必要地阻碍了规范,并且即使自JAX-RS以来也引起了混乱。在EE 6(2009)中引入。

     

这种向CDI的转换可能分两步进行;在JAX-RS 2.2中,@Context现在可以注入的所有内容也应该使用@Inject注入,默认情况下JAX-RS资源可以是CDI bean(可能除非明确禁用)。同时{@ 1}}将被弃用。在JAX-RS 3.0中,@Context实际上将被删除。

答案 1 :(得分:19)

铆接JAX-RS specification定义了您可以通过@Context注入的所有标准类型。

但如果我是你,我会查阅你选择的提供商的具体文件,看看有什么可用。

例如,RESTEasy通过@Context提供these values。同时,泽西岛提供these。显然,由于标准的上下文值,会有重叠。

答案 2 :(得分:3)

@Context注释可用于注入12个对象。以下是每个人的快速摘要

  • HttpHeaders - HTTP标头值和参数
  • UriInfo - URI查询参数和路径变量
  • 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
  }
}

以下是回答问题What is @Conext used for?

的五部分系列

答案 3 :(得分:0)

要扩展已经提供的答案:JAX-RS实现通常提供一种访问上下文的方法。对于RESTEasy,它是ResteasyContext。上下文可以通过

列出
ResteasyContext.getContextDataMap()

返回的地图的键如下所示:

interface javax.ws.rs.core.Request
interface javax.ws.rs.core.HttpHeaders
interface javax.ws.rs.ext.Providers
class org.jboss.resteasy.plugins.server.Cleanables
class org.jboss.resteasy.core.PostResourceMethodInvokers
class org.jboss.resteasy.core.InternalDispatcher
interface javax.ws.rs.container.ResourceInfo
interface io.vertx.core.http.HttpServerResponse
interface io.vertx.core.Context
interface org.jboss.resteasy.spi.Registry
interface org.jboss.resteasy.spi.HttpRequest
interface org.jboss.resteasy.spi.ResteasyDeployment
interface javax.ws.rs.container.ResourceContext
interface org.jboss.resteasy.spi.Dispatcher
interface io.vertx.ext.web.RoutingContext
interface io.vertx.core.http.HttpServerRequest
interface io.vertx.core.Vertx
interface javax.ws.rs.core.Configurable
interface org.jboss.resteasy.spi.ResteasyAsynchronousContext
interface javax.ws.rs.core.SecurityContext
interface javax.ws.rs.core.Configuration
interface javax.ws.rs.core.UriInfo
interface org.jboss.resteasy.spi.HttpResponse