【发布时间】: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