如何将OmniFaces与Spring Boot集成 [英] How to integrate OmniFaces with Spring Boot
问题描述
我找到了一些关于将JSF技术与Spring Boot集成的教程,但让OmniFaces与Spring Boot一起工作似乎是一项相当复杂的工作。将这两者集成在一起到底是不是一个好主意?
推荐答案
首先,Java EE和Spring是相互竞争的框架。通常情况下,最容易的做法是选择其中一个,而不是试图将它们混合在一起。从长远来看,它将减少初学者的困惑,减少互操作性方面的烦恼。
Java EE框架面向Java EE容器(WildFly、Tomee、Payara等),而Spring框架面向基本的Servlet容器(Tomcat、Jetty等)。JSF虽然是Java EE框架的一部分,但最初不需要太多其他Java EE构件作为依赖项,因此它也可以毫不费力地在基本的Servlet容器中运行。只需要JSTL作为Java EE的另一部分,在基本的Servlet容器中手动安装JSTL相当简单。
从JSF 2.0版开始,添加了可选的Bean验证(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针对的是JSF2.0,不需要CDI。OmniFaces 1.1x甚至没有CDI。OmniFaces 2.x针对的是JSF2.2,区别在于CDI是必需的,而不是可选的。之所以这样做,是因为OmniFaces的设计考虑到了最佳实践,并试图迫使用户转向CDI进行Bean管理,特别是因为JSF本身也将朝着需要CDI的方向发展,因此OmniFaces 2.x用户将为未来做好更好的准备。
考虑到上面解释的CDI问题,您现在应该意识到,如果您想使用Spring而不是Java EE,最好选择不使用CDI的OmniFaces 1.1x。最新的1.1x版本是1.14,这恰好是作为JoinFaces的一部分集成的。
什么是JoinFaces?
此项目支持在JAR打包的Spring Boot应用程序中使用JSF。
它自动配置PrimeFaces、PrimeFaces扩展、BootsFaces、ButterFaces、RichFaces、OmniFaces、AngularFaces、Mojarra和MyFaces库,以在嵌入式Tomcat、Jetty或Undertow Servlet容器上运行。
虽然我不喜欢Spring,也无法根据自己的经验判断,但我想说,如果您想继续使用Spring Boot+JSF,JoinFaces是您的最佳选择。
请注意,虽然JoinFaces站点声称它支持CDI批注,但这并不意味着它支持CDI实现,它实际上只支持javax.inject.*
包中的批注。
另请参阅:
- 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?
这篇关于如何将OmniFaces与Spring Boot集成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!