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

idr*_*sid 25 java jax-rs jersey

我是JAX-RS的新手,我正在努力理解@Context注释应该如何工作.

javadoc的有六类(列表Application,UriInfo,Request,HttpHeaders,SecurityContext,Providers).但是,我在Web上找到了使用此注释与其他类型的代码,例如:

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

cas*_*lin 42

@Context注解允许你注入的请求/响应方面的细节到JAX-RS提供者和资源类.可以在类字段,bean属性方法参数中执行注入.


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

除了ConfigurationProviders,这是在客户端和服务器端提供注射,所有其他类型是唯一的服务器端.

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

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

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


以下是可用于注射的每种JAX-RS类型的快速描述:

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

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

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

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

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

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

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

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

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


Vid*_*dya 19

铆接JAX-RS 规范定义了您可以注入的所有标准类型@Context.

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

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


Ale*_*dom 7

@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
  }
}
Run Code Online (Sandbox Code Playgroud)

或作为一个字段:

@Path("/")
public class EndpointResource {

  private final @Context HttpHeaders httpHeaders;

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Response getAllHttpHeaders(){
      // Code here that uses httpHeaders
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个由五部分组成的系列,回答了@Conext 的用途是什么?