我是JAX-RS的新手,我正在尝试理解@Context
注释应该如何工作。
在javadoc,有一个包含六个班级的列表(Application
,UriInfo
,Request
,HttpHeaders
,SecurityContext
,{{ 1}})。但是我在Web上找到了使用此注释与其他类型的代码,例如:
Providers
是否有可用于此注释的受支持类型列表?此列表是否在标准的实施之间发生变化?
我正在尝试使用Jersey,我担心我会编写无法移植到其他JAX-RS实现的代码。
答案 0 :(得分:39)
@Context
注释允许您将请求/响应上下文详细信息注入JAX-RS提供程序和资源类。可以在类字段, bean属性或方法参数中执行注入。
以下列表根据@Context
总结了使用JAX-RS 2.0 specification注释可以注入的所有类型:
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
Configuration
和Providers
除外
可以在客户端和服务器端提供程序中进行注入,所有其他类型都只是服务器端。
当应用程序部署在servlet容器中时,以下类型仅 :
javax.servlet.HttpServletRequest
javax.servlet.HttpServletResponse
javax.servlet.ServletConfig
javax.servlet.ServletContext
JAX-RS 2.1介绍了可以使用@Context
注入的其他类型:
除了上面列出的标准类型之外,JAX-RS实现(例如Jersey,RESTEasy和Apache CXF)可能会定义自己的类型,可以使用@Context
注入
下面简要介绍每种可用于注射的JAX-RS类型:
应用程序:可以将应用程序提供的Application
子类的实例注入到类字段或方法参数中。访问Application
子类实例允许将配置信息集中在该类中。
URI和URI模板: UriInfo
提供有关请求URI组件的静态和动态每请求信息。
标题: HttpHeaders
以地图形式或强类型便捷方法提供对请求标头信息的访问。可以使用Response
类提供响应标头。
内容协商和前置条件:Request
的方法允许调用者确定最佳匹配的表示形式,并评估资源的当前状态是否与任何先决条件相匹配请求。
安全上下文: SecurityContext
界面提供对当前请求的安全上下文信息的访问。 SecurityContext
的方法提供对当前用户主体的访问,请求者假定的角色信息,请求是否通过安全通道到达,以及使用的身份验证方案。
提供商: Providers
界面允许根据一组搜索条件查找提供者实例。预期该接口主要是希望使用其他提供者功能的提供者作者感兴趣的。它可以在客户端和服务器提供商中进行注入。
资源上下文: ResourceContext
接口提供对默认的每请求范围内的资源或子资源类的实例化和初始化的访问。可以注入它来帮助创建和初始化,或者只是初始化应用程序创建的实例。
配置:客户端和服务器运行时Configuration
都可以在提供程序(客户端或服务器)和资源类(仅限服务器)中注入。
SSE事件: SseEventSink
表示传入的SSE连接,并提供发送事件的方法。 Sse
为活动和广播公司提供工厂方法。
由post撰写的Arjan Tijms表明未来版本的JAX-RS 可能与CDI更强大的集成。因此,可以弃用@Context
,然后将其移除,以支持@Inject
:
JAX-RS 2.2
出于某种原因,JAX-RS基本上在
@Context
而不是CDI的@Inject
使用了自己的依赖注入系统。虽然JAX-RS在其最初版本发布之前的最后一刻得到了更新,以便对CDI提供一定程度的支持,但JAX-RS资源不是CDI bean的事实已经不必要地阻碍了规范,并且即使自JAX-RS以来也引起了混乱。在EE 6(2009)中引入。这种向CDI的转换可能分两步进行;在JAX-RS 2.2中,
@Context
现在可以注入的所有内容也应该使用@Inject
注入,默认情况下JAX-RS资源可以是CDI bean(可能除非明确禁用)。同时{@ 1}}将被弃用。在JAX-RS 3.0中,@Context
实际上将被删除。
答案 1 :(得分:19)
铆接JAX-RS specification定义了您可以通过@Context
注入的所有标准类型。
但如果我是你,我会查阅你选择的提供商的具体文件,看看有什么可用。
例如,RESTEasy通过@Context
提供these values。同时,泽西岛提供these。显然,由于标准的上下文值,会有重叠。
答案 2 :(得分:3)
@Context注释可用于注入12个对象。以下是每个人的快速摘要
所有这些实例都可以在资源方法中注入
@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?
的五部分系列答案 3 :(得分:0)
要扩展已经提供的答案:JAX-RS实现通常提供一种访问上下文的方法。对于RESTEasy,它是ResteasyContext
。上下文可以通过
ResteasyContext.getContextDataMap()
返回的地图的键如下所示:
interface javax.ws.rs.core.Request
interface javax.ws.rs.core.HttpHeaders
interface javax.ws.rs.ext.Providers
class org.jboss.resteasy.plugins.server.Cleanables
class org.jboss.resteasy.core.PostResourceMethodInvokers
class org.jboss.resteasy.core.InternalDispatcher
interface javax.ws.rs.container.ResourceInfo
interface io.vertx.core.http.HttpServerResponse
interface io.vertx.core.Context
interface org.jboss.resteasy.spi.Registry
interface org.jboss.resteasy.spi.HttpRequest
interface org.jboss.resteasy.spi.ResteasyDeployment
interface javax.ws.rs.container.ResourceContext
interface org.jboss.resteasy.spi.Dispatcher
interface io.vertx.ext.web.RoutingContext
interface io.vertx.core.http.HttpServerRequest
interface io.vertx.core.Vertx
interface javax.ws.rs.core.Configurable
interface org.jboss.resteasy.spi.ResteasyAsynchronousContext
interface javax.ws.rs.core.SecurityContext
interface javax.ws.rs.core.Configuration
interface javax.ws.rs.core.UriInfo
interface org.jboss.resteasy.spi.HttpResponse