Вопрос по richfaces, jboss, jsf-2 – javax.faces.FacesException: Ошибка декодирования данных ресурса при загрузке страницы JSF.

8

При загрузке страницы JSF я получаю указанную ниже ошибку. Страница загружается успешно, и желаемая операция на странице также выполняется, но появляется эта ошибка.

Страница jsf содержит панели вкладок, и при нажатии на каждую панель вкладок появляется ошибка. Также я обнаружил, что если я сохраню определенную часть моей страницы как визуализированную = false, то ошибка не наступит, но эта часть снова не будет перерисована.

Я использую JSF2.0 с JSP. и RF3.3

<code>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
</code>

Фрагмент кода страницы и компонента jsf, который при рендеринге = false в bean-компоненте не выдает вышеупомянутую ошибку.

<code><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>
</code>

Если outputPanel привязан к базовому компоненту для рендеринга и изначально установлено значение false, ошибка не приходит. Однако при повторной визуализации outputPanel outputPanel никогда не появляется.

Проблема в основном возникает при включении компонента. У меня есть 4 вкладки на странице. На двух вкладках я использую списки (2 компонента на каждой вкладке). На обеих вкладках массив источника и цели, привязанный к списку, одинаков.

Это из-за этого я привязываю один и тот же список к обоим шаттлам. Однако один и тот же код в другой вкладке работает абсолютно нормально ....

ListShuttle код: -

<code><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>
</code>

Код ArrayList: -

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

Внутри какой-то функции

<code>lstAvailable=class.function(Some variable))
this.setLstAvailable(lstAvailable);
</code>

Возможный ответ на этот пост, как я заметил, заключается в том, что я столкнулся с какими-то проблемами с браузером.

Когда к тому же приложению обращаются с другого компьютера, нет абсолютно никаких исключений ... Это странно, так как я использую Firefox 11.0, а на другой машине установлен Firefox 4.0

Может ли это быть проблемой с браузером?

Ваш Ответ

3   ответа
0

Во-первых,<rich:tabPanel> это окутывает каждый<rich:tab> должен быть внутриform (см. примечание в документации), поэтому форма внутри вкладки не обязательна. Кроме того, если вы хотите вызвать действие сервера при нажатии на какую-либо вкладку, вы должны проверить, чтоswitchType сserver значение.

Еще одна вещь, может быть, ваш код XHTML внутри<a4j:outputPanel> содержит ошибки, было бы лучше, если вы обновите свой пост с полным или большим количеством этого кода.

Мне нужно включить вкладку изнутри. Я не думаю, что форма вызывает какие-либо проблемы. Для & lt; a4j: outputPanel & gt; даже при удалении этой ошибки по-прежнему возникает ошибка. Пожалуйста, прочитайте мою правку, так как я думаю, что проблема в listhuttle. ЕСЛИ listshuttle отображается при загрузке страницы, исключение не приходит. Как только список получен, исключение наступает. AngelsandDemons
14

Теперь эта проблема возникает очень заметно во всех обновлениях Firefox & gt; 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.

Вот соответствующая проблема JIRA от jboss:issues.jboss.org/browse/RF-12062
Кажется, проблема в том, что такие символы, как «!» Firefox конвертируется в «% 21», фильтр, предложенный в этом решении, преобразует% 21 обратно в «!»; поэтому ресурс можно найти на сервере. Также обратите внимание, что шаблон url может потребоваться изменить, если ваш базовый URL содержит подпути, такие как & lt; url-pattern & gt; spring / a4j / * & lt; / url-pattern & gt; например.
Также я предлагаю сделать проверку на FF-версию в фильтре (не могу вставить код в удобной форме в комментарии, но это так же просто, как сопоставить с «Firefox / (\\ d +) \\»). \\ d + & quot; регулярное выражение).
1

Я не сомневаюсь, что ответ AnglesAndDemons здесь правильный, но по какой-то причине я не смог заставить его работать. Я использую Richfaces 3.3.3 Final, и то, что сработало, загружало исправленный richfaces-impl.jar из выпуска JIRA.https://issues.jboss.org/browse/RF-12062

Похожие вопросы