【问题标题】:javax.faces.FacesException: Error decode resource data while loading JSF pagejavax.faces.FacesException:加载 JSF 页面时解码资源数据时出错
【发布时间】:2012-04-27 17:22:41
【问题描述】:

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

jsf 页面包含选项卡面板,单击每个选项卡面板时都会出现错误。 我还发现,如果我将页面的某个部分保留为 render=false,则错误不会出现,但该部分再次不会重新呈现。

我将 JSF2.0 与 JSP 一起使用。和 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页面和组件的代码sn-p在bean中render=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 个组件)。 在两个选项卡上,绑定到 listshuttle 的源和目标的 arraylist 是相同的。

是不是因为这个原因,我将同一个列表绑定到两个航天飞机。但是另一个选项卡中的相同代码绝对可以正常工作....

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

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

【问题讨论】:

    标签: jsf-2 jboss richfaces


    【解决方案1】:

    这个问题现在在所有 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 组件相关的所有问题。

    【讨论】:

    • 这是来自 jboss 的相关 JIRA 问题:issues.jboss.org/browse/RF-12062
    • 另外我建议在过滤器中检查 FF 版本(不能在评论中以合理的形式粘贴代码,但它就像匹配“Firefox/(\\ d+)\\.\\d+" 正则表达式)。
    • 问题似乎是像'!'这样的字符由 Firefox 转换为“%21”,此解决方案中提出的过滤器会将 %21 转换回“!”因此可以在服务器中找到资源。另请注意,如果您的基本 url 包含诸如 spring/a4j/* 之类的子路径,则可能需要更改 url-pattern。
    【解决方案2】:

    我毫不怀疑 AnglesAndDemons 的答案在这里是正确的,但由于某种原因,我无法让它发挥作用。我正在使用 Richfaces 3.3.3 Final,并且起作用的是从 JIRA 问题 https://issues.jboss.org/browse/RF-12062

    下载修补的richfaces-impl.jar

    【讨论】:

      【解决方案3】:

      首先,包装每个&lt;rich:tab&gt;&lt;rich:tabPanel&gt; 必须在form 内(查看文档中的注释),因此选项卡内的表单不是必需的。此外,如果您想在单击某个选项卡时调用服务器操作,则应检查 switchTypeserver 值。

      还有一件事,也许你在&lt;a4j:outputPanel&gt; 中的 XHTML 代码包含错误,如果你用完整或更多的代码更新你的帖子会更好。

      【讨论】:

      • 我需要从选项卡内部包含。我认为表单不会导致任何问题。对于 ,即使删除它,错误仍然出现。请阅读我的编辑,因为我认为问题出在 listshuttle 上。如果 listshuttle 在页面加载时呈现为 false,则不会出现异常。一旦列表穿梭被渲染,异常就来了。
      猜你喜欢
      • 1970-01-01
      • 2017-10-22
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      相关资源
      最近更新 更多