在尝试使用OSGi中的单例资源嵌入RESTEasy时(使用与resteasy-osgi-bundle类似的东西),令我惊讶的是,注入字段@Context
UriInfo
在每个请求都可用且有效。< / p>
深入挖掘我在ThreadLocal
找到了代理魔法和ResteasyProviderFactory
。一切都很好,但我无法在docs中找到任何对这种行为的引用,既不是在RESTEasy中也不是在JAX-RS规范中。
在Jersey docs中我们可以找到类似的内容:
特定请求对象存在异常,甚至可以将其注入构造函数或类字段[ of singleton scope - OP]。对于这些对象,运行时将注入能够同时服务更多请求的代理。这些请求对象为
HttpHeaders
,Request
,UriInfo
,SecurityContext
。可以使用@Context
注释注入这些代理。
RESTEasy的外观如何?目前的实施是稳定还是实验?什么是可以注入单身的特定于请求的类?
答案 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.HttpHeaders
,javax.ws.rs.core.UriInfo
,javax.ws.rs.core.Request
,javax.servlet.HttpServletRequest
,javax.servlet.HttpServletResponse
,{{1}的实例},javax.servlet.ServletConfig
和javax.servlet.ServletContext
个对象。
虽然文档没有对字段和参数注入做任何区分,但从我记忆中来看,我认为我能够将javax.ws.rs.core.SecurityContext
注入到字段中。但我会测试它们以确保。