Jakarta ee JavaEE/OmniFaces:项目设置-使用WildFly的LinkageError

Jakarta ee JavaEE/OmniFaces:项目设置-使用WildFly的LinkageError,jakarta-ee,jboss,wildfly,omnifaces,Jakarta Ee,Jboss,Wildfly,Omnifaces,尝试将OmniFaces集成到JavaEEWeb项目中 在实现以下简单侦听器方法时,我收到链接错误。我正在使用WebSphereApplicationServer 这是怎么回事 public void useCreditCardChanged(javax.faces.event.ValueChangeEvent event) { Boolean oldVal = (Boolean) event.getOldValue(); Boolean newVal = (Boolean) e

尝试将OmniFaces集成到JavaEEWeb项目中

在实现以下简单侦听器方法时,我收到链接错误。我正在使用WebSphereApplicationServer

这是怎么回事

public void useCreditCardChanged(javax.faces.event.ValueChangeEvent event) {
    Boolean oldVal = (Boolean) event.getOldValue();
    Boolean newVal = (Boolean) event.getNewValue();
    if (oldVal!=null) {
        this.useCreditCard = newVal;
    }
    FacesContext.getCurrentInstance().renderResponse();
}
以及日志文件:

11:25:48.806 S [ConfigureListene  257] Critical error during deployment: : 
java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.omnifaces.taghandler.ValidateUniqueColumn.processValueChange(Ljavax/faces/event/ValueChangeEvent;)V" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/omnifaces/taghandler/ValidateUniqueColumn, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface javax/faces/event/ValueChangeListener have different Class objects for the type (Ljavax/faces/event/ValueChangeEvent;)V used in the signature
at java.lang.Class.forName0(Native Method) [rt.jar:1.7.0_51]
at java.lang.Class.forName(Class.java:270) [rt.jar:1.7.0_51]
at com.sun.faces.util.Util.loadClass(Util.java:325) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.processor.AbstractConfigProcessor.loadClass(AbstractConfigProcessor.java:376) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processHandlerClass(FaceletTaglibConfigProcessor.java:427) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processTags(FaceletTaglibConfigProcessor.java:378) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processTagLibrary(FaceletTaglibConfigProcessor.java:321) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.process(FaceletTaglibConfigProcessor.java:270) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:437) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:214) [jsf-impl-2.2.5-jbossorg-3.jar:]
at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:187) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:86)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:71)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_51]
at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]

11:25:48.808 E [ServiceControlle 1955] MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./my-app: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./my-app: Failed to start service
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904) [jboss-msc-1.2.0.Final.jar:1.2.0.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_51]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_51]
    at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]

Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.omnifaces.taghandler.ValidateUniqueColumn.processValueChange(Ljavax/faces/event/ValueChangeEvent;)V" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/omnifaces/taghandler/ValidateUniqueColumn, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface javax/faces/event/ValueChangeListener have different Class objects for the type (Ljavax/faces/event/ValueChangeEvent;)V used in the signature
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:216)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:86)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:71)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.0.Final.jar:1.2.0.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.0.Final.jar:1.2.0.Final]
    ... 3 more

Caused by: java.lang.RuntimeException: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.omnifaces.taghandler.ValidateUniqueColumn.processValueChange(Ljavax/faces/event/ValueChangeEvent;)V" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/omnifaces/taghandler/ValidateUniqueColumn, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface javax/faces/event/ValueChangeListener have different Class objects for the type (Ljavax/faces/event/ValueChangeEvent;)V used in the signature
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:273)
    at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173)
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:187)
    ... 7 more

Caused by: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.omnifaces.taghandler.ValidateUniqueColumn.processValueChange(Ljavax/faces/event/ValueChangeEvent;)V" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/omnifaces/taghandler/ValidateUniqueColumn, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface javax/faces/event/ValueChangeListener have different Class objects for the type (Ljavax/faces/event/ValueChangeEvent;)V used in the signature
    at java.lang.Class.forName0(Native Method) [rt.jar:1.7.0_51]
    at java.lang.Class.forName(Class.java:270) [rt.jar:1.7.0_51]
    at com.sun.faces.util.Util.loadClass(Util.java:325)
    at com.sun.faces.config.processor.AbstractConfigProcessor.loadClass(AbstractConfigProcessor.java:376)
    at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processHandlerClass(FaceletTaglibConfigProcessor.java:427)
    at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processTags(FaceletTaglibConfigProcessor.java:378)
    at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.processTagLibrary(FaceletTaglibConfigProcessor.java:321)
    at com.sun.faces.config.processor.FaceletTaglibConfigProcessor.process(FaceletTaglibConfigProcessor.java:270)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:437)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:214)
    ... 9 more
原因:java.lang.RuntimeException:java.lang.RuntimeException:java.lang.LinkageError:接口itable初始化中的加载程序约束冲突:解析方法“org.omnifaces.taghandler.ValidateUniqueColumn.processValueChange(Ljavax/faces/event/ValueChangeEvent;)V”类加载程序时当前类的(org/jboss/modules/ModuleClassLoader实例)、org/omnifaces/taghandler/ValidateUniqueColumn和接口javax/faces/event/ValueChangeListener的类加载器(org/jboss/modules/ModuleClassLoader实例)具有不同类型的类对象(Ljavax/faces/event/ValueChangeEvent;)签名中使用的V

在webapp的运行时类路径中有多个不同版本的JSF API类。在这个特定的问题中,特别是对于
javax.faces.event.ValueChangeEvent
类,在webapp的运行时类路径中发现了多个不同的版本。换句话说,webapp的运行时类路径是脏的。很可能是JARs在webapp的
/WEB-INF/lib
中,这些库不属于这里,因为appserver本身已经将这些库(如javaee和JSF)运出了包装箱

然后你的问题中还有一件奇怪的事情。你正在谈论并标记了
[websphere]
,但堆栈跟踪中列出的特定于appserver的类清楚地表明它是,这是一个完全不同的服务器,但也许可以解释为什么要添加
[jboss]
tag。同样,这是两个完全不同的服务器。知道你在使用什么


无论如何,探索webapp的
/WEB-INF/lib
,去掉appserver本身已经提供的库,比如
javaee.jar
jsf api.jar
,等等。

首先,非常感谢你的回答和WildFly的提示。我们从Glassfish切换到WildFly,并讨论了很多应用服务器。对不起,我想知道你是对的,正如我在另一篇文章()中所解释的,我已经在服务器站点和as EJB库中包含了我的JSF实现(jboss-JSF-api_2.2_spec-2.2.5.jar)。如果我不将它添加到EJB库中,我可以编译,但我的bean是空的,原因是:“类加载错误:类型javax.faces.event.valuechangevent from[Module”deployment.myApp.ear.APPcore.jar:main“从服务模块加载器]找不到”。您的业务层(EJB)应该没有任何JSF(和Servlet)工件。JSF(和OmniFaces)不属于业务层,而只属于web层(WAR)。否则,您的业务层无法在其他web层(如JAX-RS、Spring MVC等)上重用。您需要将JSF特定的代码从EJB移动到WAR,并确保您的服务类中没有一个具有(间接的)依赖于
javax.faces.*
classes.Wow,这意味着从这个角度来看,我们的项目设置是完全错误的。要识别web和业务层并不容易,因为CDI bean可以轻松绑定到web层并提供业务逻辑。这一点上的决策很重要,不是吗?CDI确实在这两层上都是可用的。好的是的,看起来是时候进行一些重构了。首先,
javax.faces.*
javax.servlet.*
javax.el.*
不属于业务层。业务层应该只提供JPA
@Entity
类、EJB
@Stateful
等类,必要时还应该提供一些非事务类所有业务服务(那些根本不与DB交互的服务,例如web scraper,它们实际上可以被命名为
)。这些服务依次被
@Inject
嵌入到web层的JSF托管bean中,而这些bean又被Facelets(XHTML)引用文件。非常感谢这些简短的解释。现在确实是进行重构的时候了。例如,CDIBeans基本上应该用作web层上的JSF托管bean,并将业务逻辑委托给业务层上的ejb/CDI,以便在它们之间进行强有力的切割,对吗?