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

pwe*_*wes 7 jax-rs resteasy

在尝试使用OSGi中的单例资源嵌入RESTEasy时(使用与resteasy-osgi-bundle类似的东西),令我惊讶的是,现场注入@Context UriInfo可用并且在每个请求上都有效.

进一步挖掘我发现代理魔术和ThreadLocalResteasyProviderFactory.一切都很好,但我无法在docs中找到任何对这种行为的引用,既不是在RESTEasy中也不是在JAX-RS规范中.

Jersey文档中,我们可以找到类似的内容:

特定请求对象存在例外,它甚至可以注入构造函数或类字段[ 具有单例范围的资源 - OP].对于这些对象,运行时将注入能够同时服务更多请求的代理.这些请求的对象是HttpHeaders,Request,UriInfo,SecurityContext.可以使用@Context注释注入这些代理.

它在RESTEasy中看起来如何?目前的实施是稳定还是实验?可以注入单例的特定于请求的类的集合是什么?

Pau*_*tha 10

这不是实验性的.此行为(对于一组公共对象)在JAX-RS规范中指定.规范页面中没有任何锚点链接到某个部分,但您应该查看的内容是第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注释将实例注入到类字段或方法参数中.

需要注意的一点是,可以注入更多类型,但上面未列出的任何类型都是特定于实现的.以下是第15章@Context中 RESTeasy文档的列表

@Context注解允许你注入的情况下javax.ws.rs.core.HttpHeaders,javax.ws.rs.core.UriInfo,javax.ws.rs.core.Request,javax.servlet.HttpServletRequest,javax.servlet.HttpServletResponse,javax.servlet.ServletConfig,javax.servlet.ServletContext,和javax.ws.rs.core.SecurityContext对象.

虽然文档没有对字段和参数注入做任何区分,但从我记忆中来看,我认为我能够HttpServletRequest注入一个字段.但我会测试它们以确保.

  • 哈,没想到这个.有时阅读规格封面而不仅仅是潜伏,这是值得的...顺便说一句,在JAX-RS 2.0中它是第9章.谢谢! (2认同)