WildFly 12.0.0.Final JSF 2.3 & f:websocket - Class 加载程序问题

WildFly 12.0.0.Final JSF 2.3 & f:websocket - Class loader issue

尝试让 EJB 在文档(行)插入 MongoDB 集合时通知我的 XHTML JSF 页面。

由于我先前问题的答案,使 JSF 2.3 可以正常工作:

然而,在将服务器端代码添加到我的 EJB 并尝试将我的 EAR 部署到 WildFly 12.0 之后。0.Final 我得到了 PushContext 的 java.lang.ClassNotFoundException:

Caused by: java.lang.RuntimeException: WFLYSRV0177: Error getting reflective information for class com.notifywell.ejb.FoodsCosmeticsMedicinesEJB with ClassLoader ModuleClassLoader for Module "deployment.NOTiFYwell.ear.NOTiFYwellJAR.jar" from Service Module Loader

    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
    at java.lang.Class.getDeclaredFields(Class.java:1916)
    at org.jboss.as.server.deployment.reflect.ClassReflectionIndex.<init>(ClassReflectionIndex.java:72)
    at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:70)
    ... 13 more
Caused by: java.lang.ClassNotFoundException: javax.faces.push.PushContext from [Module "deployment.NOTiFYwell.ear.NOTiFYwellJAR.jar" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:199)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:412)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:400)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
    ... 18 more

在 EJB 中使用:

@Inject
@Push
private PushContext push;

包含在:

jboss-jsf-api_2.3_spec-2.3.3.SP1.jar

当我将 @Inject 添加到 @Push 时会发生这种情况。

WildFly 12 and/orJSF 2.3 中的 CDI 有任何问题吗?

used in EJB:

@Inject
@Push

永远不要在 EJB 中使用面向前端的库。这样,您的 EJB 就会与 JSF 前端紧密耦合,并且完全无法再用于其他前端,例如 JAX-RS、JSP/Servlet 等

@Push 文档甚至 explicitly 提到仅在 WAR 侧注入它。

另请参阅:

  • why shouldn't entity bean be managed by JSF framework?

add the 'jboss-jsf-api_2.3_spec-2.3.3.SP1.jar' to my deployed EAR/JAR:

永远不要向 运行 时间 class 路径添加重复的 classes。它只会混淆 class 加载器。目标 运行time (WildFly) 本身已经提供了特定的库。您不需要从部署开始就提供它。

另请参阅:

  • How to properly install and configure JSF libraries via Maven?

Any issues with CDI in WildFly 12 and/or JSF 2.3?

不适合我。 The OmniFaces showcase 目前 运行s WildFly 12 与 JSF 2.3 和 @Push 的 OmniFaces 对应物工作得很好。

您只需要记住 explicitly 指示 WildFly 12 使用 standalone-ee8.xml 当您打算在其上使用 JSF 2.3 时。也用在IDE的时候。在Eclipse中,创建服务器时,可以在新建服务器向导的配置文件入口指定,默认为standalone.xml .

如果您仍然面临 class 加载问题,那么这只能意味着您在其他方面弄乱了 运行time class 路径。这可能有更多的原因,这些原因在目前提供的信息中是看不到的。对于像你这样的初学者,在关于 class 路径问题的问题中没有立即提及 class 路径配置(因此表明对此一无所知),最好不要乱用 运行time classpath(或平均 IDE 中调用的“Build Path”和“Libraries”)直到你理解它。 Java EE 默认提供所有开箱即用的东西,完全不需要 调整项目中的库。

保留所有默认设置,在 WAR 中注入 @Push 而不是 EJB,并告诉 WildFly 在 EE8 模式下使用 运行,一切都会顺利进行。

另请参阅:

  • What exactly is Java EE?