2.11. CDI 集成
RESTEasy 和 CDI 之间的集成由 resteasy-cdi
模块提供。
JAX-RS 和 CDI 规范都引入了自己的组件模型。放入 CDI 存档中的每个类(满足一组基本限制)均隐式为 CDI Bean。要使成为 JAX-RS 组件,需要使用
明确声明您的 Java 类。如果没有集成代码,标注适合作为带 JAX-RS 注释的 CDI Bean 的类会导致错误结果,并且 JAX-RS 组件不是由 CDI 管理的。@Path
或 @Providerresteasy-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
快速入门。