带有 JSF 2.2 的 javaee-api-7.0:f:ajax 不提交

javaee-api-7.0 with JSF 2.2: f:ajax does not submit

我有一个 Spring 4.1.1、JSF 2.2.3、Primefaces 5.1 Web 应用程序 运行 在 Java 8 和 Tomcat 8.

在我的同事将 javaee-api-7.0 添加为 ActiveMQ 的 javax 依赖项之前,一切都运行良好。

有了这个 jar,每个 ajax 调用都不会向后端提交数据。例如,primefaces datadatable 上的过滤器将始终传递一个空值,ajax 刷新不会考虑已处理的字段等。如果我删除 jar,一切都会重新开始工作。

不幸的是,日志没有显示任何错误,输出与不包含 jar 时的输出完全相同。我也不确定与哪个组件有冲突,我假设是 JSF,但我不知道,也找不到任何在线文档。

Everything worked perfectly until my colleague added the javaee-api-7.0 as a dependency for javax for ActiveMQ.

您确实不应该在 webapp 的 运行time 类路径中包含该 JAR。这种库应该已经由目标 Java EE 容器提供。 Java EE 容器的示例有 WildFly、GlassFish、Liberty、TomEE 等。但是您已经找到了 Tomcat,这是一个支持巨大 Java EE [=39= 的准系统 servletcontainer ] 仅 JSP、Servlet 和 EL APIs,您必须在其上手动安装所有其他 Java EE 工件,例如 JSF 和 JMS。

javaee-api.jar 包含 ALL Java EE API,包括 JSF API(2.2. 0 版本)。在你的例子中,这个版本显然在类加载方面优先于你在 /WEB-INF/lib 中已经拥有的 JSF API 版本。这只会导致“奇怪”的行为,因为加载的 JSF impl 版本与加载的 JSF API 版本不匹配。

你需要换个方式解决。您需要将 JMS 安装在它自己的 API/impl JAR 文件中,就像您已经为 JSF 所做的一样,因此绝对不能通过“全局”javaee-api.jar 文件。对于 ActiveMQ,JMS API 在 activemq-all.jar 中可用。改用那个。它涵盖了在 Tomcat.

上使 ActiveMQ 达到 运行 所需的一切

另请参阅:

  • how to include javax.jms.* in eclipse?
  • How do I import the javax.servlet API in my Eclipse project?