当前位置: 首页 > 面试题库 >

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

逄俊贤
2023-03-14
问题内容

当尝试在OSGi中将RESTEasy与单例资源嵌入时(使用类似于resteasy-osgi-bundle的方式),令我惊讶的@Context UriInfo是,在每个请求中都注入了有效的字段。

进一步挖掘我发现代理魔术和ThreadLocalResteasyProviderFactory。很好,但是我在RESTEasy的文档和JAX-RS规范中都找不到任何有关此类行为的参考。

在Jersey文档中,我们可以找到以下内容:

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

它在RESTEasy中的外观如何?当前的实施是稳定的还是试验性的?可以注入单例的请求特定类的集合是什么?


问题答案:

这不是实验性的。此行为(针对一组公共对象)在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注释将的实例注入类字段或方法参数中。

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

该@Context注释可以让你的注入情况下javax.ws.rs.core.HttpHeadersjavax.ws.rs.core.UriInfojavax.ws.rs.core.Requestjavax.servlet.HttpServletRequestjavax.servlet.HttpServletResponsejavax.servlet.ServletConfigjavax.servlet.ServletContext,和javax.ws.rs.core.SecurityContext对象。

尽管文档没有在字段注入和参数注入之间进行任何区分,但据我所记得,我认为我能够将其HttpServletRequest注入到字段中。但是我只测试它们以确保。



 类似资料:
  • 我已经看了很多帖子,似乎没有什么能像我喜欢的那样工作。 我想将一个对象从一个过滤器注入到ContainerRequestContext属性中,然后在其他类中检索它。 这是我的过滤器: 下面是我想要访问ContainerRequestContext的类: 我的spring配置: 如果我将容器请求上下文注入到我的 Web 资源中,一切都按预期工作。但是,如果调用我的提供程序类容器请求上下文始终为空。

  • 问题内容: 我正在尝试在Spring中建立一个请求范围的bean。 我已经成功设置好了,所以每个请求创建一次bean。现在,它需要访问HttpServletRequest对象。 由于该bean是每个请求创建一次的,所以我认为容器可以轻松地将请求对象注入到我的bean中。我怎样才能做到这一点 ? 问题答案: 可以将请求范围的Bean与请求对象自动连接。

  • 我有一个spring AOP方面类,它在每次调用服务时都会记录日志,我计划在日志中打印更多信息,这次每个请求都会有唯一的标识符,该标识符存储在请求范围的对象中,直到服务返回。我尝试将请求对象注入到@方面,但似乎效果不佳。 如果只有一个建议,它在我调用该服务时起作用,如果我添加更多建议,它会出错。(问题结束) 日志错误

  • 本文解释了可以将RequestScoped Bean注入ApplicationScoped Bean中,并且客户机代理将在请求期间指向正确的实例:在CDI中,较短范围的Bean实例注入较大范围的Bean实例中-它是如何工作的? 当使用一个单独的生产者类进行额外处理并生成RequestScoped bean时,这是如何工作的?在部署到应用服务器时,由于不明确的依赖关系,我得到一个Deployment

  • 我试图用jsf和CDI编写一个简单的登录表单。问题是当我注入我的SessionScoped bean时,它不像我期望的那样工作。这是我的豆子 这是我的控制器: 还有一个简单的Jsf表单,它调用login函数并显示LoginInfo类的计数器字段。 通过单击登录按钮和调试变量,我可以看到“lo”是这样的: lo={LoginInfo$Proxy$_$$_WeldClientProxy@16688}“

  • 我得到的错误是: 我检查的内容: > 已启用批注处理,否则AnyService根本不会实例化 AnyBean不是最终的 请求作用域在AnyBean中与AspectJ代理(ScopedProxyMode.target_class)一起定义 存在EnableAspectJAutoproxy批注 类路径上有以下JAR: Web XML还包含RequestContextListener: 当我向org.s