【问题标题】:error@malformedXML with ajax requests in JSF在 JSF 中带有 ajax 请求的 error@malformedXML
【发布时间】:2017-05-17 21:17:33
【问题描述】:

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

我有一个 JSF 应用程序,它在 Weblogic 10.3.6 上,并且我在 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,但随后会产生下述错误并“刷新”页面。


富豪脸

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

单击此按钮会正确执行 myBean.commandButton,但随后会产生下述错误并“刷新”页面。


素颜

<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 上进行部署,我不得不通过here 中提到的 weblogic-application.xml 强制 Weblogic 使用给定的 JSF 2.1.6 包,例如:

<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() 返回 2.1.6-SNAPSHOT 并且 wls-cat 工具返回以下冲突包列表,而 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.*

有人对这个问题有想法吗?
提前致谢。

【问题讨论】:

  • 您是否在所有浏览器或某些特定浏览器中观察到这种行为?
  • @VikasSachdeva 是的,我在 Firefox 和 IE 上观察到这种行为。
  • @BalusC 我编辑了帖子以添加一些有关 Weblogic 配置的信息以及它似乎使用了错误的 jsf.js 文件的事实:这可能是问题的根源吗?
  • 如果您从分享的浏览器图片中注意到,对 jsf.js 的请求有 HTTP 304 响应状态码,这意味着 jsf.js 文件已被缓存,请尝试清除浏览器缓存

标签: ajax primefaces jsf-2 richfaces


【解决方案1】:

我终于解决了这个问题:
服务器发送的真实文件不是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>

【讨论】:

  • glassfish server 4.1..的解决方案是什么?
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2017-12-03
  • 2020-08-17
  • 2011-11-15
  • 2014-07-25
相关资源
最近更新 更多