【问题标题】:What objects can I inject using the @Context annotation?我可以使用@Context 注解注入哪些对象?
【发布时间】:2014-01-23 02:42:34
【问题描述】:

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

javadoc 有六个类的列表(ApplicationUriInfoRequestHttpHeadersSecurityContextProviders)。但是我在网上找到了将 this 注释与其他类型一起使用的代码,例如:

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

}

是否有可与此注释一起使用的受支持类型列表?此列表是否会随着标准的实施而变化?

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

【问题讨论】:

  • 我相信这取决于实施。有一个提供者(我不知道实现的确切名称)解析参数类型并生成适当的参数以供使用。

标签: java jersey jax-rs


【解决方案1】:

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


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

ConfigurationProviders 除外,它们 在客户端和服务器端提供程序中都是可注入的,所有其他类型都是仅限服务器端

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

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

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


以下是可用于注入的每种 JAX-RS 类型的简要说明:

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

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

  • 标头: HttpHeaders 以映射形式或通过强类型便利方法提供对请求标头信息的访问。可以使用Response 类提供响应标头。

  • 内容协商和先决条件:Request 的方法允许调用者确定最佳匹配的表示变体,并评估资源的当前状态是否匹配请求中的任何先决条件.

  • 安全上下文:SecurityContext 接口提供对有关当前请求的安全上下文信息的访问。 SecurityContext 的方法提供对当前用户主体的访问、有关请求者承担的角色的信息、请求是否通过安全通道到达以及使用的身份验证方案。

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

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

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

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


Arjan Tijms 编写的 post 表明 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(可能除非明确禁用)。同时@Context 将被弃用。在 JAX-RS 3.0 中,@Context 将被实际删除。

【讨论】:

    【解决方案2】:

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

    但如果我是你,我只会查阅你选择的提供商的特定文档,看看有什么可用的。

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

    【讨论】:

    • 感谢您的回复。对于其他感兴趣的人,规范的正确链接:download.oracle.com/otndocs/jcp/jaxrs-2_0-fr-eval-spec/…(您需要先接受许可)
    • 我提供的链接是正确的,但在我接受了您所说的许可后,它确实有一个“AuthParam”。没有该查询参数的编辑链接应该可以正常工作。
    • 相关link to the Jersey user guide。引用:“这些请求对象是HttpHeaders、Request、UriInfo、SecurityContext。这些代理可以使用@Context注解注入。”
    【解决方案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?

    【讨论】:

      【解决方案4】:

      扩展已经提供的答案: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
      

      【讨论】:

        猜你喜欢
        • 2012-10-01
        • 2012-07-06
        • 2010-11-30
        • 1970-01-01
        • 2013-12-12
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多