JSF 中的 error@malformedXML 请求 ajax

error@malformedXML with ajax requests in JSF

上下文:Weblogic 12.2.1/JSF 2.1.6/Richfaces 4.2.2/Primefaces 3.4

我有一个在 Weblogic 10.3.6 上运行的 JSF 应用程序,我成功部署在 Weblogic 12.2.1 上。

每次 ajax 请求后我都面临以下错误:

Received 'error@malformedXML' event from <input ...
[200] undefined: undefined

当要呈现的组件不在页面中时,通常会发生此错误,但正如您将在以下代码片段中看到的那样,情况并非如此:

Java

private int count = 0;

public void commandButton() {
    System.out.println("Click");
    count++;
}

public int getCount() {
    return count;
}

public void setCount(int count) {
    this.count = count;
}

HTML


JSF 与 Ajax

<h:form>
    <h:commandButton value="JSF with ajax">
        <f:ajax listener="#{myBean.commandButton}" render="count1" />
    </h:commandButton>
    <h:outputText id="count1" value="#{myBean.count}" />
</h:form>

单击此按钮正确执行 myBean.commandButton,但随后产生如下所述的错误并执行页面 "refresh"。


Richfaces

<h:form>
    <a4j:commandButton value="Richfaces" action="#{myBean.commandButton}" render="count2" />
    <h:outputText id="count2" value="#{myBean.count}" />
</h:form>

单击此按钮正确执行 myBean.commandButton,但随后产生如下所述的错误并执行页面 "refresh"。


Primefaces

<h:form>
    <p:commandButton value="Primefaces" action="#{myBean.commandButton}" update="count3" />
    <h:outputText id="count3" value="#{myBean.count}" />
</h:form>

单击此按钮会正确执行 myBean.commandButton 并使用增量值呈现输出文本。


编辑 1:

为了在 Weblogic 12.2.1 上部署,我不得不强制 Weblogic 通过 weblogic-application.xml 使用给定的 JSF 2.1.6 包,如 here 所述,例如:

<prefer-application-packages>
    <package-name>javax.faces.*</package-name>
    <package-name>com.sun.faces.*</package-name>
    <package-name>com.bea.faces.*</package-name>
</prefer-application-packages>

<prefer-application-resources> 
    <resource-name>javax.faces.*</resource-name> 
    <resource-name>com.sun.faces.*</resource-name> 
    <resource-name>com.bea.faces.*</resource-name> 
    <resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</resource-name>
    <resource-name>META-INF/services/com.sun.faces.spi.FacesConfigResourceProvider</resource-name>
    <resource-name>META-INF/resources/javax.faces/jsf.js</resource-name>
</prefer-application-resources>

我很确定 JSF 包没有冲突,因为 FacesContext.class.getPackage().getImplementationVersion() returns 2.1.6-SNAPSHOT 和 wls-cat 工具 returns 以下冲突的包列表和 JSF 的包不在其中。

但我注意到,即使我强制 Weblogic 使用我的 JSF 包中的 META-INF/resources/javax.faces/jsf.js,它实际上使用 Weblogic 的 JSF 包中的 jsf.js 文件: Web browser jsf.js

冲突包列表:

com.google.common.*
com.sun.mail.*
javax.el.*
javax.mail.*
javax.mail.event.*
javax.mail.internet.*
javax.mail.search.*
javax.mail.util.*
javax.persistence.*
javax.persistence.spi.*
javax.servlet.*
javax.servlet.http.*
javax.servlet.jsp.*
javax.transaction.*
javax.transaction.xa.*
javax.validation.*
javax.validation.bootstrap.*
javax.validation.constraints.*
javax.validation.groups.*
javax.validation.metadata.*
javax.validation.spi.*
net.jcip.annotations.*
net.sf.cglib.*
oracle.core.lmx.*
oracle.core.lvf.*
oracle.jdbc.*
oracle.jdbc.connector.*
oracle.jdbc.driver.*
oracle.jdbc.internal.*
oracle.jdbc.oci.*
oracle.jdbc.oracore.*
oracle.jdbc.pool.*
oracle.jdbc.rowset.*
oracle.jdbc.util.*
oracle.jdbc.xa.*
oracle.jpub.runtime.*
oracle.net.ano.*
oracle.net.jndi.*
oracle.net.ns.*
oracle.net.nt.*
oracle.net.resolver.*
oracle.security.o3logon.*
oracle.sql.*
oracle.sql.converter.*
org.aopalliance.aop.*
org.aopalliance.intercept.*
org.apache.commons.*
org.apache.oro.*
org.apache.xerces.*
org.apache.xmlbeans.*
org.bouncycastle.*
org.bouncycastle.asn1.*
org.bouncycastle.crypto.*
org.bouncycastle.i18n.*
org.bouncycastle.jce.*
org.bouncycastle.math.*
org.bouncycastle.ocsp.*
org.bouncycastle.util.*
org.bouncycastle.x509.*
org.slf4j.*
org.slf4j.helpers.*
org.slf4j.spi.*
org.w3c.dom.*
repackage.*
schemaorg_apache_xmlbeans.system.sXMLCONFIG.*
schemaorg_apache_xmlbeans.system.sXMLLANG.*
schemaorg_apache_xmlbeans.system.sXMLSCHEMA.*
schemaorg_apache_xmlbeans.system.sXMLTOOLS.*

有人知道这个问题吗?
提前致谢。

我终于解决了这个问题:
服务器发送的真实文件不是META-INF/resources/javax.faces/jsf.js而是META-INF/resources/javax.faces/jsf-uncompressed.js.

因此 weblogic-application.xml 文件必须具有以下配置:

<prefer-application-packages>
    <package-name>javax.faces.*</package-name>
    <package-name>com.sun.faces.*</package-name>
</prefer-application-packages>

<prefer-application-resources> 
    <resource-name>javax.faces.*</resource-name>
    <resource-name>com.sun.faces.*</resource-name>
    <resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</resource-name>
    <resource-name>META-INF/services/com.sun.faces.spi.FacesConfigResourceProvider</resource-name>
    <resource-name>META-INF/resources/javax.faces/jsf.js</resource-name>
    <resource-name>META-INF/resources/javax.faces/jsf-uncompressed.js</resource-name>
</prefer-application-resources>