如何将 OmniFaces 与 Spring Boot 集成

How to integrate OmniFaces with Spring Boot

我找到了一些关于将 JSF 技术与 Spring Boot 集成的教程,但是让 OmniFaces 与 Spring Boot 一起工作似乎是一项相当复杂的工作。将这两者整合在一起是个好主意吗?

首先,JavaEE和Spring是相互竞争的框架。一般来说,最简单的方法是选择一个或另一个而不是试图混合它们。从长远来看,它最终会减少初学者的困惑和互操作性方面的烦恼。

Java EE 框架面向 Java EE 容器(WildFly、TomEE、Payara 等),而 Spring 框架面向准系统 servlet 容器(Tomcat、码头等)。 JSF 虽然是 Java EE 框架的一部分,但最初并不需要很多其他 Java EE 工件作为依赖项,因此它也可以毫不费力地 运行 在准系统 servlet 容器中。只需要 JSTL 作为 Java EE 的另一部分,手动安装在准系统 servlet 容器中相当简单。

从 JSF 2.0 版开始,添加了一个可选的 Bean Validation (JSR303) 依赖项,它也很容易安装在准系统 servlet 容器中。

从 JSF 2.2 版开始,添加了一个可选的 CDI 依赖项,这在 Weld 的情况下也很容易安装在准系统 servlet 容器中。然而,麻烦来了:Spring只支持部分CDI。支持 javax.inject.* 中的任何内容,但不支持 javax.enterprise.context.* 中的任何内容。这迫使或多或少的用户使用 Spring 管理的 bean 而不是 CDI 管理的 bean。

根据未来的 JSF 2.3 版本,将弃用 JSF 自己的 @ManagedBean 工具,需要 CDI 依赖项,并添加更多可选的 Java EE 依赖项:WebSocket (JSR356)和 JSONP (JSR353)。完全需要 CDI 不能与 Spring 一起很好地发挥作用,因为他们拒绝完全实施 CDI。

OmniFaces 又完全面向 JSF。 OmniFaces 1.x 针对 JSF 2.0,不需要 CDI。 OmniFaces 1.1x 甚至没有 CDI。 OmniFaces 2.x 针对 JSF 2.2,不同之处在于 CDI 是必需的而不是可选的。这样做是因为 OmniFaces 在设计时考虑到了“最佳实践”,并试图迫使用户转向 CDI 进行 bean 管理,特别是因为 JSF 本身也会朝着需要 CDI 的方向发展,因此 OmniFaces 2.x 用户将为未来做好更好的准备。

考虑到上面解释的 CDI 问题,您现在可能已经意识到如果您想使用 Spring 而不是 Java EE,最好选择无 CDI 的 OmniFaces 1.1x。最新的 1.1x 版本是 1.14,这恰好作为 JoinFaces.

的一部分集成

What is JoinFaces?

This project enables JSF usage inside JAR packaged Spring Boot Application.

It autoconfigures PrimeFaces, PrimeFaces Extensions, BootsFaces, ButterFaces, RichFaces, OmniFaces, AngularFaces, Mojarra and MyFaces libraries to run at embedded Tomcat, Jetty or Undertow servlet containers.

虽然我不是 Spring 人并且无法根据自己的经验判断,但如果您想继续使用 Spring,我会说 JoinFaces 是您的最佳选择启动 + JSF.

请注意,虽然 JoinFaces 网站说它支持 CDI 注释,但这并不意味着它支持 CDI 实现,它实际上只支持来自 javax.inject.* 包的 annotations .

另请参阅:

  • What exactly is Java EE?
  • Backing beans (@ManagedBean) or CDI Beans (@Named)?
  • How to install and use CDI on Tomcat?
  • When is it necessary or convenient to use Spring or EJB3 or all of them together?
  • Spring JSF integration: how to inject a Spring component/service in JSF managed bean?