【问题标题】:Custom JSF Implementation With Custom DI Framework使用自定义 DI 框架的自定义 JSF 实现
【发布时间】:2019-04-04 16:18:51
【问题描述】:

作为 JSF 2.3,@ManagedBean 和其他 javax.faces.bean.* 注释已被弃用并被 JavaEE 6 CDI 取代。

我成功地制作了一个示例 JSF 项目,并使用服务器实现“glassfish.jsf.jar”将其部署到 WebLogic,并且在 WEB-INF/lib 中没有实现 JSF 或 CDI。

但我害怕有时会被服务器实现卡住,因为我的应用程序在不同的应用程序服务器中工作时表现不同,所以我认为如果我能控制 JSF 实现会更好。

过去 4 天我一直在寻找一种方法来使用自定义 JSF 实现(Mojarra 或 MyFaces),使用新的 CDI 注释或任何其他 DI 框架,但没有运气。

如果我想摆脱 @ManagedAnnotations,我必须使用 JSF 和 CDI 的 JavaEE 服务器实现。

我的问题:有没有办法在我的 WAR 中包含我首选的 JSF 和 CDI 实现,这些实现将部署到不同的应用程序服务器,如 WebLogic 和 WildFly。

注意:我从 2013 年找到了一个 old question,答案为否,但我想知道这个答案是否仍然有效

2018 年 2 月 11 日编辑: 我成功地在 Tomcat 服务器上安装了一个带有嵌入式 JSF (Mojarra) 和 CDI (Weld) 的项目,没有任何问题。我想是因为Tomcat是Servlet Container所以没有冲突。

我认为我的问题是因为我的嵌入式 CDI 和 Weld 的服务器实现版本之间存在冲突。我找不到让我的应用程序像黑盒一样的解决方案。

我使用了这个 weblogic.xml 假的

    <prefer-application-packages>
        <package-name>!javax.servlet.*</package-name>   
    </prefer-application-packages>

    <prefer-application-resources>
        <resource-name>!javax.servlet.*</resource-name>
    </prefer-application-resources>

【问题讨论】:

  • 我知道 WildFly 允许动态交换 JSF 实现。这可能会解决您的部分麻烦。然而,两台服务器都被锁定在 CDI 实现中(实际上它应该是 Weld 在两者中),因为需要非常特定的服务器端实现来内部处理 EJB 支持、拦截器、挂钩到服务器生命周期等。我无法想象服务器可以轻松替换 CDI老实说执行。 (几乎)所有 EE 技术都以某种方式与 CDI 集成,充其量您需要供应商特定的 API/SPI 供服务器处理。
  • @Siliarus 我也“无法想象服务器可以轻松取代 CDI 实现”,但我要求在做出决定之前确定。我无法理解像这样在 CDI 和 JSF 之间建立粘合剂的好处,因为如果当前的服务器实现有问题,升级就不容易了。 Weblogic 不提供一年后的版本。
  • 我想说的是 WildFly,它通常是最新的并且易于升级到新版本。
  • @Siliarus 我们有两个客户的问题。其中之一使用 WebLogic 而没有任何改变的意图,因此,应用程序将在不同的实现和/或 JSF 和 CDI 版本上运行。我认为最好使用 JSF2.2 和 Spring 来避免任何未来的问题,你怎么看?
  • 我不熟悉 Spring 来判断。尽管您的客户真的需要最新的实施版本吗?毕竟规格不会经常变化......

标签: jsf cdi


【解决方案1】:

另一个答案仍然有效。但是还有其他(更好的)选择

1 还提供完整的 java-ee 容器作为应用程序的一部分。

2 需要特定应用服务器的最低版本

3 告诉客户他们至少需要某些库的特定版本

【讨论】:

  • 谢谢。我相信你的回答是正确的,但我会再等几天。对于选项 1:我不知道该怎么做,您能否为我提供一个示例链接。选项 2 和 3:如果我在客户站点或最新版本 12.2.1.3 中的当前 Weblogic12c 12.2.1.0 实施版本中遇到错误,那么我们将不得不采用解决方法(如果可用)或接受缺点。此外,升级并不容易,因为我们的客户在我们旁边部署了许多旧应用程序。所以我想我会在找到解决方案之前将 JSF 2.2 与 Spring 一起使用
  • 在这里使用 Spring 有什么好处? MyFaces 2.3 仍然可以在没有 CDI 的情况下工作,不知道 Mojarra 2.3 是否可以在没有 CDI 的情况下工作。但是,在 JSF 3.x 中,CDI 将是必需的依赖项。如果您必须支持许多版本的 JavaEE 和 JavaEE 应用程序服务器,最好将您的应用程序基于 JSF 2.0 和 CDI 1.0。从 JavaEE6 开始就支持此功能,如果您不使用 @ManagedBeans....,它甚至可能与 JavaEE9 一起使用
  • Mojarra 2.3 仍然可以在没有 CDI 的情况下工作,但会警告 @ManagedBean 已被弃用。我的意思是使用 spring 来替代 CDI,但我相信现在如果我们要使用 JSF,我们应该考虑使用 JEE 全栈来实现未来的项目升级兼容性,或者使用嵌入式 JSF 2.2,而不打算使用 Spring 升级它。跨度>
猜你喜欢
  • 2016-08-01
  • 2010-09-09
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多