2012-04-16 115 views
8

加載JSF頁面時出現下面提到的錯誤。 成功加載頁面,並且頁面上的所需操作也完成,但出現此錯誤。javax.faces.FacesException:在加載JSF頁面時解碼資源數據頁面

jsf頁面包含選項卡面板,單擊每個選項卡面板時出現錯誤。 此外,我發現如果我保留頁面的某個部分呈現= false,那麼錯誤不會到來,但該部分不會再被重新渲染。

我正在使用JSF2.0和JSP。和JSF頁面和組件,當呈現=以豆假的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 

代碼段不引發上述的錯誤。

<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被綁定到渲染和intially值設置爲false錯誤不來支持豆。 但是,在重新渲染outputPanel時,outputPanel從不出現。

問題基本上出現在包含組件上。 我在頁面中有4個選項卡。在兩個選項卡上,我使用listshuttle(每個選項卡上有兩個組件)。 在這兩個選項卡上,綁定到listshuttle的源和目標的ArrayList都相同。

也正是由於這一點,我綁定同一份名單,無論是在shuttles.However另一個標籤相同的代碼工作絕對沒問題....

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

這對瀏覽器來說可能是一個問題。

回答

13

現在,所有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 – 2013-02-04 13:54:26

+1

另外我會建議在過濾器中檢查FF版本(不能將代碼粘貼到一個合理的形式,但與匹配「Firefox /(\\ d +)\\。\\ d +」正則表達式一樣簡單。 – 2013-02-04 13:57:36

+0

問題似乎是像'!'這樣的字符被firefox轉換爲'%21',這個解決方案中提出的過濾器會將%21轉換回'!'所以可以在服務器中找到資源。另外請注意,如果您的基本url包含子路徑,例如 spring/a4j/*,則可能需要更改url-pattern。 – ollbap 2014-08-06 10:25:08

0

首先,每個<rich:tab>包裝的<rich:tabPanel>必須在form(請查看文檔中的註釋)內,因此選項卡中的表格不是必需的。另外,如果您想在某個選項卡中單擊時調用服務器操作,則應該使用server值檢查switchType

還有一件事,也許你的<a4j:outputPanel>裏面的XHTML代碼包含錯誤,如果你用完整或更多的代碼更新你的文章會更好。

+1

我需要從tab內包含。我不認爲窗體導致任何問題的種類。對於,即使刪除它,錯誤仍然存​​在。請閱讀我的編輯,因爲我認爲問題在於listshuttle。如果listshuttle在頁面加載時呈現爲false,則不會發生異常。列表飛梭一旦呈現,就會出現異常。 – AngelsandDemons 2012-04-17 07:58:25

1

我毫不懷疑AnglesAndDemons的答案在這裏是正確的,但由於某種原因,我無法讓它工作。我正在使用Richfaces 3.3.3 Final,並且工作的是從JIRA問題下載補丁的richfaces-impl.jar https://issues.jboss.org/browse/RF-12062