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

Java 我可以使用@Context注释注入哪些对象?,java,jersey,jax-rs,Java,Jersey,Jax Rs,我是JAX-RS新手,我试图理解@Context注释应该如何工作 在顶部有六个类的列表(应用程序,UriInfo,请求,HttpHeaders,安全上下文,提供者)。但是,我在web上发现将此注释与其他类型一起使用的代码,例如: @GET public String something(@Context HttpServletRequest req) { } 是否有可用于此批注的受支持类型的列表?该列表是否在标准实施期间发生变化 我目前正在试验Jersey,我担心我会编写无法移植到其他JAX

我是JAX-RS新手,我试图理解
@Context
注释应该如何工作

在顶部有六个类的列表(
应用程序
UriInfo
请求
HttpHeaders
安全上下文
提供者
)。但是,我在web上发现将此注释与其他类型一起使用的代码,例如:

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

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

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

引人入胜的JAX-RS定义了可以通过
@Context
注入的所有标准类型

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

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

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


以下列表总结了根据注释可以使用注释注入的所有类型:

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

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

介绍了可注入的其他类型:

除了上面列出的标准类型之外,JAX-RS实现(如和)还可以定义自己的类型,这些类型可以使用注入


下面是可供注入的每种JAX-RS类型的快速描述:

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

  • URI和URI模板:根据请求提供关于请求URI组件的静态和动态信息

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

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

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

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

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

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

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


作者的这篇文章表明,JAX-RS的未来版本可能与CDI有更强的集成。So可能会被弃用,然后被删除以支持:

JAX-RS 2.2 出于某种原因,JAX-RS使用了自己的依赖注入系统,该系统基于
@Context
,而不是CDI的
@Inject
。虽然JAX-RS在最初发布之前的最后一刻进行了更新,以获得对CDI的某种程度的支持,但JAX-RS资源不是CDIBeans这一事实不必要地阻碍了规范的发展,甚至在EE6(2009)中引入JAX-RS之后也造成了混乱

这种向CDI的转换可能分两步进行;在JAX-RS 2.2中,现在可以由
@Context
注入的所有内容也应该可以使用
@Inject
进行注入,JAX-RS资源默认为CDIBean(可能除非明确禁用)。同时,
@Context
将被弃用。在JAX-RS3.0中,上下文实际上会被删除


@Context注释可用于注入12个对象。下面是对每一个问题的简要总结

  • HttpHeaders-HTTP标头值和参数
  • UriInfo-URI查询参数和路径变量
  • SecurityContext-允许访问给定HTTP请求的安全相关数据
  • 请求-允许先决条件请求处理
  • ServletConfig-ServletConfig
  • ServletContext-ServletContext
  • HttpServletRequest—请求的HttpServletRequest实例
  • HttpServletResponse-HttpServletRe
    @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
      }
    }
    
    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