当前位置: 首页 > 知识库问答 >
问题:

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

屈俊远
2023-03-14

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

在javadoc中有一个包含六个类的列表(< code >应用程序、< code>UriInfo、< code >请求、< code>HttpHeaders、< code >安全上下文、< code >提供者)。但是,我在网上找到了将this批注用于其他类型的代码,例如:

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

}

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

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

共有3个答案

呼延靖
2023-03-14

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

  • HttpHeaders-HTTP头值和参数
  • UriInfo-URI查询参数和路径变量
  • SecurityContext-提供对给定HTTP请求的安全相关数据的访问
  • 请求-允许预处理请求处理
  • ServletConfig-ServletConfig
  • ServletContext-ServletContext
  • HttpServletRequest-请求的HttpServletRequest实例
  • HttpServletResponse-HttpServer响应实例
  • 应用程序、配置和提供程序-

所有这些实例都可以注入到resource方法中

@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
  }
}

这是一个由五部分组成的系列,回答了@ Conext是用来做什么的问题。

云弘壮
2023-03-14

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

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

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

梁丘波
2023-03-14

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

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

  • javax.ws.rs.core.Application
  • javax.ws.rs.core.HttpHeaders
  • javax.ws.rs.core.Request
  • javax.ws.rs.core.SecurityContext
  • javax.ws.rs.core.UriInfo
  • javax.ws.rs.core.Configuration
  • javax.ws.rs.container.ResourceContext
  • javax.ws.rs.ext.Providers

除了可在客户端和服务器端提供程序中注入的< code >配置和< code >提供程序之外,所有其他类型都仅适用于服务器端。

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

  • javax.servlet.HttpServletRequest
  • javax.servlet.HttpServletResponse
  • javax.servlet.ServletConfig
  • javax.servlet.ServletContext

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

    < Li > < code > javax . ws . RS . SSE . SSE < Li > < code > javax . ws . RS . SSE . sseeventsink

除了上面列出的标准类型之外,JAX-RS 实现(如泽西岛、RESTEasy 和 Apache CXF)可能会定义自己的类型,这些类型可以使用@Context注入。

下面是对每种可用于注射的JAX-RS类型的简要描述:

> < li>

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

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

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

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

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

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

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

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

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

Arjan Tijms写的这篇文章暗示JAX-RS的未来版本可能会与CDI有更强的集成。因此,< code>@Context可能会被弃用,然后被移除以支持< code>@Inject:

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

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

 类似资料:
  • 问题内容: 我是JAX-RS的新手,我试图了解注释的工作方式。 在javadoc中有六个等级的列表()。但是,我在网络上找到将this注释与其他类型一起使用的代码,例如: 是否有可以与此注释一起使用的受支持类型的列表?在执行标准之间,此列表是否会更改? 我目前正在试验Jersey,我担心自己写的代码无法移植到其他JAX-RS实现中。 问题答案: 铆接的JAX-RS 规范定义了你可以通过注入的所有标

  • 我试图实现这样的东西 但我不知道这是否可行有人能帮我谢谢你

  • 由于请求的不同用法和注释,我一直很困惑

  • 我有一个pb,我找不到解决方案,因为我认为我的项目中有多个pb相关: 有人能帮我吗?我可以给你链接到git存储库,也可以看到所有的项目。谢谢。

  • 问题内容: 我想知道是否有一种方法可以指定在类方法之前调用方法。我知道这样的事情应该是可能的,因为JUnit具有before(),所以我想做的事情是相似的。 这是我想做的一个具体例子 基本上我想要一个注释在foo()之前告诉编译器或jvm调用init() 问题答案: 如果有的话,您可以使用此接口的实例和方法的内部包装,您可以自由检查方法是否带注释,并根据该方法执行一些操作: 或者,您可以尝试使用A

  • 问题内容: 我想将通用映射分组到中,但不能使用,因为我的实体已经扩展了另一个。所以我需要一个类似下面的界面: 我想像下面这样使用它: 我的意思是说这项工作可行吗? 我可以在接口上使用@MappedSuperclass注释吗? Hibernate是否支持接口? 问题答案: 号如前所述这里: JPA不直接支持接口或变量关系。