【问题标题】:WildFly 12.0.0.Final JSF 2.3 & f:websocket - Class loader issueWildFly 12.0.0.Final JSF 2.3 & f:websocket - 类加载器问题
【发布时间】:2018-09-26 08:19:50
【问题描述】:

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

感谢对我之前问题的回答,让 JSF 2.3 正常工作:

f:websocket in 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 和/或 JSF 2.3 中的 CDI 是否存在任何问题?

【问题讨论】:

  • ejb 层(后端)应该对推送(前端)一无所知。使用 ejb 中的 cdi 事件)和前端的观察者来通信两层。见stackoverflow.com/questions/25947790/…
  • 我在这里关注 BalusC 的 JSF 2.3+ 示例:stackoverflow.com/questions/3787514/…
  • 正确,但是如果仔细观察,您会看到前端 cdi bean(在战争中)中使用的推送,它也有一个事件观察器,并且事件被抛出在无状态 ejb . EJB 中没有“推送”。

标签: wildfly cdi weld jboss-weld jsf-2.3


【解决方案1】:

在 EJB 中使用:

@Inject
@Push

您不应该在 EJB 中使用面向前端的库。这样一来,您的 EJB 就会与 JSF 前端紧密耦合,并且对于其他前端(例如 JAX-RS、JSP/Servlet 等)完全不可重用。

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

另见:


将“jboss-jsf-api_2.3_spec-2.3.3.SP1.jar”添加到我部署的 EAR/JAR:

您不应该将重复的类添加到运行时类路径中。它只会混淆类加载器。特定库已由目标运行时 (WildFly) 本身提供。您无需从部署开始就提供它。

另见:


WildFly 12 和/或 JSF 2.3 中的 CDI 有任何问题吗?

不适合我。 The OmniFaces showcase 当前运行带有 JSF 2.3 的 WildFly 12,而 @Push 的 OmniFaces 对应版本运行良好。

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

如果您仍然面临类加载问题,那只能意味着您以其他方式弄乱了运行时类路径。这可能有更多原因,这些原因在目前提供的信息中不可见。对于像您这样的初学者,在关于类路径问题的问题中没有立即提及类路径配置(因此表明对此一无所知),最好不要乱用运行时​​类路径(或“构建路径”和“库”正如在普通 IDE 中所调用的那样),直到您了解它为止。 Java EE 默认已经提供了所有的东西,完全不需要在项目中调整库。

保持一切默认,在 WAR 中注入 @Push 而不是 EJB,并告诉 WildFly 在 EE8 模式下运行,一切都会顺利。

另见:

【讨论】:

  • 非常感谢您的详细解释。问题是 EJB 中的 @Inject @Push,移到了 POJO。我从 EAR & WAR 中删除了 WildFly JSF 2.3 JAR,它部署得很好。我也遇到了 beanManager.fireEvent 的问题。这是由于使用了已弃用的:javax.faces.bean.ApplicationScoped 切换到 javax.enterprise.context.ApplicationScoped 并且观察者工作。
猜你喜欢
  • 1970-01-01
  • 2018-09-26
  • 2018-09-28
  • 2017-12-18
  • 2019-08-11
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多