2014-01-05 31 views
20

我是JAX-RS的新手,我试图理解@Context注释应该如何工作。可以使用@Context注释注入哪些对象?

javadoc有六班(ApplicationUriInfoRequestHttpHeadersSecurityContextProviders)的列表。但是我发现,使用此批注与其他类型,例如在网络上的代码:

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

} 

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

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

+0

我相信这是由实现。有一个提供者(我不知道实现的确切名称)解析参数类型并生成一个适当的参数来使用。 –

回答

15

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

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

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

+0

感谢您的回复。对于任何感兴趣的人,该规范的正确链接:http://download.oracle.com/otndocs/jcp/jaxrs-2_0-fr-eval-spec/index.html (您需要先接受许可证) – idrosid

+0

我提供的链接是正确的,但是在您接受许可证后,它确实有一个“AuthParam”。没有查询参数的编辑链接应该可以正常工作。 – Vidya

+0

@Vidya感谢您的链接。 –

27

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


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

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

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

JAX-RS 2.1引入的其它类型的可与@Context被注入:

除了标准的以上列举的,JAX-RS实现,如JerseyRESTEasyApache CXF,可能定义可以使用@Context注入的自己的类型。


查找下面可用于注入每个JAX-RS类型的简单描述:

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

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

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

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

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

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

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

  • 配置:客户端和服务器运行时Configuration s为可用于注射提供商(客户端或服务器)和资源类(服务器只)。

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

3

@Context注释可用于注入12个对象。这是每个人的

  • HttpHeaders的快速摘要 - HTTP头valuesand参数
  • UriInfo - URI查询参数和路径变量
  • SecurityContext的 - 可以访问到安全相关的数据,给定的HTTP请求
  • 请求 - 允许前提请求处理
  • 的ServletConfig - 所述的ServletConfig
  • 的ServletContext - ServletContext中
  • 的HttpServletRequest - HttpServletResponse的实例
  • 应用,配置和提供者 - - 为对请求
  • HttpServletResponse的HttpServletRequest的实例>提供有关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?