javax.faces.FacesException: 加载JSF页面时解码资源数据出错

8

在加载JSF页面时,我遇到了以下错误。 页面成功加载,所需的操作也完成了,但是会出现此错误。

JSF页面包含选项卡面板,单击每个选项卡面板时都会出现错误。 我发现,如果我将页面的某一部分保留为rendered=false,则不会出现错误,但该部分也不会重新渲染。

我正在使用带有JSP的JSF2.0和RF3.3。

ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception
javax.faces.FacesException: Error decode resource data
at org.ajax4jsf.resource.ResourceBuilderImpl.decrypt(ResourceBuilderImpl.java:627)
at org.ajax4jsf.resource.ResourceBuilderImpl.getResourceDataForKey(ResourceBuilderImpl.java:371)
at org.ajax4jsf.resource.InternetResourceService.serviceResource(InternetResourceService.java:156)
at org.ajax4jsf.resource.InternetResourceService.serviceResource(InternetResourceService.java:141)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:508)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:601)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.util.zip.DataFormatException: incorrect data check
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:238)
at java.util.zip.Inflater.inflate(Inflater.java:256)
at org.ajax4jsf.resource.ResourceBuilderImpl.decrypt(ResourceBuilderImpl.java:621)
    ... 25 more

以下是 JSF 页面和组件的代码片段,当在 Bean 中将其渲染为 false 时,不会抛出上述错误。

<rich:tab ignoreDupResponses="true" id="tabModify"
    style="overflow:auto" styleClass="richTab" label="#{}"
    eventsQueue="queueForTab" actionListener="#{}">
    <rich:layout>
        <rich:layoutPanel position="right" id="pnlmodfy">
            <h:form id="frmModify">
                <h:panelGrid>
                    <h:outputLabel value="#{} * :" escape="false" styleClass="intro" />
                    <h:outputText value=" : " styleClass="intro" />
                    <rich:comboBox id="Mdfy" value="#{Bean.str}"
                        suggestionValues="#{Bean.arraylist}">
                        <a4j:support id="id"
                            actionListener="#{Bean.actionListener}"
                            ajaxSingle="true" event="onchange" reRender="modify">
                        </a4j:support>
                    </rich:comboBox>
                </h:panelGrid>
                <a4j:outputPanel id="modify" ajaxRendered="true">
                    <h:panelGrid columns="3" id="modify">
                        <h:outputText value="Description *" styleClass="intro"/>
                        <h:outputText value=" : " styleClass="intro" />
                        <h:inputTextarea id="Desc" required="true"
                            styleClass="textBox" label="Description"
                            value="#{Bean.strDesc}">
                        </h:inputTextarea>

如果outputPanel绑定到用于渲染的后备bean,最初将值设置为false,则不会出现错误。 但是,在重新呈现outputPanel时,outputPanel从未出现。
问题基本上出现在包含组件上。 页面上有4个选项卡。 在两个选项卡上,我正在使用listshuttle(每个选项卡上都有2个组件)。 在这两个选项卡上,源和目标的arraylist绑定到listshuttle是相同的。
是由于我将相同的列表绑定到两个shuttle引起的吗? 然而,在另一个选项卡中,相同的代码完全正常运行....
ListShuttle代码:-
<h:outputText value="Select" styleClass="intro" rendered="#{!empty Bean.lstAvailable}"/>
<h:outputText value=" : " styleClass="intro" />
<rich:listShuttle id="listShuttleN" sourceValue="#{Bean.lstAvailable}" targetValue="#{KPIManagement.lstSelected}"  var="items" listsHeight="100" sourceListWidth="100" targetListWidth="100" sourceCaptionLabel="Available" targetCaptionLabel="Selected" rendered="#{!empty Bean.lstAvailable}">       
<rich:column>
<h:outputLabel value="#{items}"></h:outputLabel>
</rich:column>
</rich:listShuttle>

ArrayList 代码:

ArrayList<String> lstAvailable=new ArrayList<String>();

在某些函数内部

lstAvailable=class.function(Some variable))
this.setLstAvailable(lstAvailable);

根据观察,我遇到了某种浏览器问题,可能是导致这个问题的原因。

当从另一台机器访问同一个应用程序时,绝对没有异常出现......这很奇怪,因为我使用的是Firefox 11.0,而另一台机器上则是Firefox 4.0。

这真的可能是浏览器的问题吗?

3个回答

14

现在这个问题在所有Firefox版本升级到10.0及以上时都非常明显地出现了。

Firefox浏览器脚本中发生了一些变化,导致无法正确读取树形结构。

请将以下内容添加到您的项目中,以消除所有与Firefox浏览器相关的问题:

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class RichFacesFirefox11Filter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request) {
            @Override
            public String getRequestURI() {
                try {
                    return URLDecoder.decode(super.getRequestURI(), "UTF-8");
                } catch (UnsupportedEncodingException e) {

                    throw new IllegalStateException("Cannot decode request URI.", e);
                }
            }
        }, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // do nothing
    }

    @Override
    public void destroy() {
        // do nothing
    }

}

请确保将这个过滤器的条目添加到您的web.xml文件中。

<filter>
    <filter-name>RichFacesFirefox11Filter</filter-name>
    <filter-class>Packagename.RichFacesFirefox11Filter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>RichFacesFirefox11Filter</filter-name>
    <url-pattern>/a4j/*</url-pattern>
  </filter-mapping>
这肯定会消除所有与Firefox浏览器和RichFaces组件相关的问题。

1
这是来自jboss的相关JIRA问题:https://issues.jboss.org/browse/RF-12062 - Jakub Bochenski
1
我建议在过滤器中检查FF版本(无法在评论中以合理的形式粘贴代码,但它只是匹配“Firefox /(\ d +)\. \ d +”正则表达式这么简单)。 - Jakub Bochenski
问题似乎在于像'!'这样的字符被Firefox转换为'%21',此解决方案中提出的过滤器将把%21转换回'!',以便可以在服务器上找到资源。还要注意,如果您的基本URL包含子路径,则可能需要更改url-pattern,例如<url-pattern>spring/a4j/*</url-pattern>。 - ollbap

1
我毫不怀疑AnglesAndDemons的答案是正确的,但出于某种原因,我无法使其正常运作。我使用的是Richfaces 3.3.3 Final版本,成功的方法是从JIRA问题https://issues.jboss.org/browse/RF-12062下载修补过的richfaces-impl.jar文件。

0
首先,每个 <rich:tab> 包裹的 <rich:tabPanel> 必须放在 form 中(请查看文档中的注释),因此标签内部的表单不是必需的。另外,如果您想在点击某个选项卡时调用服务器操作,应该将 switchType 值设置为 server
还有一件事,也许您 <a4j:outputPanel> 内的 XHTML 代码存在错误,最好更新您的帖子,包含完整或更多的代码。

1
我需要在选项卡内部进行包含。我不认为表单会引起任何问题。对于 a4j:outputPanel,即使删除它,错误仍然存在。请阅读我的编辑,因为我认为问题出在列表穿梭框上。如果在页面加载时将列表穿梭框呈现为false,则不会出现异常。只要渲染列表穿梭框,异常就会出现。 - AngelsandDemons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接