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

2022-09-01 02:50:43

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

javadoc上有一个包含六个类(,,,,)的列表。但是,我在 Web 上找到将此注释用于其他类型的代码,例如:ApplicationUriInfoRequestHttpHeadersSecurityContextProviders

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

}

是否有可与此批注一起使用的受支持类型的列表?此列表在标准实施之间是否会发生变化?

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


答案 1

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


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

除了配置提供程序(可在客户端和服务器端提供程序中注入)之外,所有其他类型都只是服务器端

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

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

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


在下面找到每种可用于注入的JAX-RS类型的快速描述:

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

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

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

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

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

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

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

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

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


Arjan Tijms撰写的这篇文章表明,JAX-RS的未来版本可能与CDI更强的集成。因此,@Context可能会被弃用,然后被删除,以支持@Inject

JAX-RS 2.2

由于某种原因,JAX-RS在很大程度上已经随着时间的流逝而丢失,它使用自己的依赖注入系统,而不是CDI的。虽然 JAX-RS 在最初发布前的最后一刻进行了更新,以便对 CDI 提供一定程度的支持,但 JAX-RS 资源不是 CDI bean 这一事实已经不必要地阻碍了规范,并且自 EE 6 (2009) 中引入 JAX-RS 以来也引起了混乱。@Context@Inject

这种向CDI的转变可能分2步进行;在 JAX-RS 2.2 中,现在所有可以注入的东西也应该是可注入的,并且 JAX-RS 资源在缺省情况下将是 CDI bean(除非显式禁用)。同时将被弃用。在 JAX-RS 中,3.0 实际上将被删除。@Context@Inject@Context@Context


答案 2

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

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

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


推荐