搜索

2.11. CDI 集成

download PDF

RESTEasy 和 CDI 之间的集成由 resteasy-cdi 模块提供。

JAX-RS 和 CDI 规范都引入了自己的组件模型。放入 CDI 存档中的每个类(满足一组基本限制)均隐式为 CDI Bean。要使成为 JAX-RS 组件,需要使用 @Path 或 @Provider 明确声明您的 Java 类。如果没有集成代码,标注适合作为带 JAX-RS 注释的 CDI Bean 的类会导致错误结果,并且 JAX-RS 组件不是由 CDI 管理的。resteasy-cdi 模块是一个网桥,它允许 RESTEasy 处理从 CDI 容器获取的类实例。

在 Web 服务调用期间,resteasy-cdi 模块向 CDI 容器询问 JAX-RS 组件的受管实例。然后,此实例将传递到 RESTEasy。如果受管实例因某种原因不可用,例如类放置在非 bean 部署存档的 JAR 文件中,RESTEasy 会返回实例化类本身。

因此,可以在 JAX-RS 组件中使用注入、生命周期管理、事件、解码和拦截器绑定等 CDI 服务。

2.11.1. 默认范围

未明确定义范围的 CDI bean 默认是 @Dependent scoped。这种伪范围意味着 Bean 能够适应它所注入的 Bean 的生命周期。随着组件的生命周期界限明确指定,包括请求、会话和应用在内的普通范围更适合 JAX-RS 组件。因此,resteasy-cdi 模块会以以下方式更改默认范围范围:

  • 如果 JAX-RS 根资源未显式定义范围,它将绑定到请求范围。
  • 如果 JAX-RS 提供程序或 javax.ws.rs.Application 子类未显式定义范围,它将绑定到应用范围。
警告

由于所有未声明范围的 bean 都由 resteasy-cdi 模块修改,因此这也会影响到会话 Bean。因此,如果在规范禁止这些组件为 @RequestScoped 时自动更改无状态会话 Bean 或单例的范围,则会发生冲突。因此,在使用无状态会话 Bean 或单例时,您需要明确定义范围。以后的版本中可能会删除这个要求。

resteasy-cdi 模块与 JBoss EAP 捆绑在一起。因此,不需要单独下载模块或添加任何额外的配置。有关使用带有 JAX-RS 资源的 CDI Bean 的工作示例,请参见 JBoss EAP 附带的 kitchensink 快速入门。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.