请求范围的上下文字段注入RESTEasy单例

时间:2015-06-02 09:04:21

标签: jax-rs resteasy

在尝试使用OSGi中的单例资源嵌入RESTEasy时(使用与resteasy-osgi-bundle类似的东西),令我惊讶的是,注入字段@Context UriInfo在每个请求都可用且有效。< / p>

深入挖掘我在ThreadLocal找到了代理魔法和ResteasyProviderFactory。一切都很好,但我无法在docs中找到任何对这种行为的引用,既不是在RESTEasy中也不是在JAX-RS规范中。

Jersey docs中我们可以找到类似的内容:

  

特定请求对象存在异常,甚至可以将其注入构造函数或类字段[ of singleton scope - OP]。对于这些对象,运行时将注入能够同时服务更多请求的代理。这些请求对象为HttpHeadersRequestUriInfoSecurityContext。可以使用@Context注释注入这些代理。

RESTEasy的外观如何?目前的实施是稳定还是实验?什么是可以注入单身的特定于请求的类?

1 个答案:

答案 0 :(得分:10)

它不是实验性的。此行为(对于一组公共对象)在JAX-RS spec中指定。规范页面中没有任何锚点链接到某个部分,但您应该在哪里看第5章:上下文。我会在这里发布一些片段。

  

5.1并发

     

上下文特定于特定请求,但某些JAX-RS组件(具有除每个请求之外的生命周期的提供程序和资源类)的实例可能需要支持多个并发请求。当注入5.2节中列出的类型之一的实例时,提供的实例必须能够为特定请求选择正确的上下文。使用线程本地代理是实现此目的的常用方法。

     

5.2上下文类型

     

本节介绍资源类,提供程序和Application子类可用的上下文类型。

     

5.2.1申请

     

可以使用Application注释将应用程序提供的@Context子类的实例注入到类字段或方法参数中。访问Application子类实例允许将配置信息集中在该类中。请注意,这不能注入Application子类本身,因为这会创建循环依赖项。

     

5.2.2 URI和URI模板

     

可以使用UriInfo注释将@Context的实例注入到类字段或方法参数中。 UriInfo提供有关请求URI组件的静态和动态每请求信息。例如。以下内容将返回请求中任何查询参数的名称:

     

5.2.3标题

     

可以使用HttpHeaders注释将@Context的实例注入到类字段或方法参数中。 HttpHeaders以地图形式或强类型便捷方法提供对请求标头信息的访问。例如。以下内容将返回请求中所有标头的名称:

     

5.2.4内容谈判和先决条件

     

JAX-RS使用Request接口简化了对内容协商和前提条件的支持。可以使用Request注释将@Context的实例注入到类字段或方法参数中。 Request的方法允许调用者确定最佳匹配表示变量,并评估资源的当前状态是否与请求中的任何前提条件匹配...

     

5.2.5安全背景

     

SecurityContext接口提供对当前请求的安全上下文信息的访问。可以使用SecurityContext注释将@Context的实例注入到类字段或方法参数中。 SecurityContext的方法提供对当前用户主体的访问,请求者所承担的角色的信息,请求是否通过安全信道到达以及使用的认证方案。

     

5.2.6提供商

     

Providers接口允许根据一组搜索条件查找提供程序实例。可以使用Providers注释将@Context的实例注入到类字段或方法参数中。

需要注意的一点是,可以注入更多类型,但上面未列出的任何类型都是特定于实现的。以下是Chapter 15. @Context

部分中RESTeasy文档的列表
  

@Context注释允许您注入javax.ws.rs.core.HttpHeadersjavax.ws.rs.core.UriInfojavax.ws.rs.core.Requestjavax.servlet.HttpServletRequestjavax.servlet.HttpServletResponse,{{1}的实例},javax.servlet.ServletConfigjavax.servlet.ServletContext个对象。

虽然文档没有对字段和参数注入做任何区分,但从我记忆中来看,我认为我能够将javax.ws.rs.core.SecurityContext注入到字段中。但我会测试它们以确保。