a4j: поддержка reRender, вызывающая исключение NumberFormatException - PullRequest
1 голос
/ 21 февраля 2012

У меня есть следующий код JSF (урезанный ради здравомыслия):

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
            xmlns:s="http://jboss.com/products/seam/taglib"
            xmlns:a4j="http://richfaces.org/a4j"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:c="http://java.sun.com/jstl/core"
            xmlns:h="http://java.sun.com/jsf/html"
            template="layout/template.xhtml">

<ui:define name="body">

<h1>#{messages['l.userConfig']}</h1>

<h:panelGrid styleClass="tblCenter">

<h:dataTable
    rowClasses="#{principalHome.editOrNewMode?'rowClear':'rowClear,rowShaded'}"
    styleClass="dataTable"
    var="row"
    value="#{principalHome.editOrNewMode ? principalHome.editList : principalList.users}"
    columnClasses="allCols">

<h:column>
    <f:facet name="header">
        <h:outputText value="#{messages['l.principalsTable.userNameCol']}"/>
    </f:facet>
    <f:facet name="footer">
        <s:decorate template="Edit.xhtml">
            <h:panelGrid columns="2">
                <h:outputText value="#{messages['l.principalsTable.userNameCol']}"/>
                <h:inputText
                    required="true"
                    validator="#{principalHome.validateUniqueName}"
                    value="#{principalHome.instance.username}"
                    autocomplete="off" />
                <h:outputText value="#{messages['l.principalsTable.passwordCol']}"/>
                <h:inputSecret
                id="password"
                    required="#{principalHome.instance.ldapStr == 'false'}"
                    redisplay="true"
                    value="#{principalHome.instance.password}"
                    disabled="#{principalHome.instance.ldapStr == 'true'}"
                    autocomplete="off" />
            </h:panelGrid>
        </s:decorate>
    </f:facet>

    <s:decorate template="View.xhtml">
        #{row.username}
    </s:decorate>
</h:column>

<h:column>
    <f:facet name="header">
    <h:outputText value="#{messages['l.principalsTable.ldapUserCol']}"/>
</f:facet>
<f:facet name="footer">
    <s:decorate template="Edit.xhtml">
        <h:selectBooleanCheckbox id="ldapUser" value="#{principalHome.instance.ldapUser}">
            <a4j:support event="onclick" ajaxSingle="true" reRender="password" />
        </h:selectBooleanCheckbox>
    </s:decorate>
</f:facet>
<s:decorate template="View.xhtml">
    <h:panelGroup columns="1" id="enabledPanel">
        <h:graphicImage id="enabled" title="LDAP User" url="/img/check-16.png" rendered="#{row.ldapStr=='true'}" />
    </h:panelGroup>
</s:decorate>
</h:column>

</h:dataTable>

<ui:include src="common/TableNavigation.xhtml"/>

<h:panelGrid columns="2">
    <h:outputText value="#{messages['t.permissions.hint']}"/>
    <s:button
        rendered="#{!principalHome.editOrNewMode and !s:hasRole('read-only')}"
        style="float:right;"
        action="#{principalHome.createEntity}"
        value="#{messages['l.gbl.addButton']}"
        styleClass="submit">
</s:button>
</h:panelGrid>
<h:outputText value="#{messages['t.permissions.hint2']}" rendered="#{!s:hasRole('all-site-admin') and principalHome.editOrNewMode}"/>

</h:panelGrid>
</ui:define>
</ui:composition>

Цель состоит в том, чтобы при нажатии на selectBooleanCheckbox поле пароля было включено / отключено | требуется / не требуетсятребуется соответственно.Когда происходит событие onclick в a4j: support, меня встречает следующее исключение:

5:34:39,668 WARNING [lifecycle] java.lang.NumberFormatException: Trying to extract rowIndex from clientId 'tform:j_id219:j_id242:j_id244:ldapUser' For input string: "j_id242"
javax.faces.FacesException: java.lang.NumberFormatException: Trying to extract rowIndex from clientId 'tform:j_id219:j_id242:j_id244:ldapUser' For input string: "j_id242"
at javax.faces.component.UIData.invokeOnComponent(UIData.java:878)
at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:720)
at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:675)
at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:720)
at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:675)
at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:720)
at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:675)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:239)
at org.ajax4jsf.component.AjaxViewRoot.processDecodes(AjaxViewRoot.java:412)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:530)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.shockwatch.servlet.IE9CompatablityFixServlet.doFilter(IE9CompatablityFixServlet.java:14)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
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.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
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:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NumberFormatException: Trying to extract rowIndex from clientId 'tform:j_id219:j_id242:j_id244:ldapUser' For input string: "j_id242"
at javax.faces.component.UIData.invokeOnComponent(UIData.java:861)
... 59 more
15:34:39,669 SEVERE [lifecycle] JSF1054: (Phase ID: APPLY_REQUEST_VALUES 2, View ID: /PrincipalEdit.xhtml) Exception thrown during phase execution: javax.faces.event.PhaseEvent[source=com.sun.faces.lifecycle.LifecycleImpl@6d34f3c8]
15:34:39,708 ERROR [Exceptions] handled and logged exception
javax.servlet.ServletException: java.lang.NumberFormatException: Trying to extract rowIndex from clientId 'tform:j_id219:j_id242:j_id244:ldapUser' For input string: "j_id242"
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:277)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:530)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.shockwatch.servlet.IE9CompatablityFixServlet.doFilter(IE9CompatablityFixServlet.java:14)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
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.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
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:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.FacesException: java.lang.NumberFormatException: Trying to extract rowIndex from clientId 'tform:j_id219:j_id242:j_id244:ldapUser' For input string: "j_id242"
at javax.faces.component.UIData.invokeOnComponent(UIData.java:878)
at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:720)
at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:675)
at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:720)
at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:675)
at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:720)
at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:675)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:239)
at org.ajax4jsf.component.AjaxViewRoot.processDecodes(AjaxViewRoot.java:412)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
... 47 more
Caused by: java.lang.NumberFormatException: Trying to extract rowIndex from clientId 'tform:j_id219:j_id242:j_id244:ldapUser' For input string: "j_id242"
at javax.faces.component.UIData.invokeOnComponent(UIData.java:861)
... 59 more

Когда я удаляю a4j: support, исключение больше не генерируется, но, конечно, поле пароля нене обновлялся ... Я также попытался удалить атрибут ajaxSingle, который также привел к тому, что исключение больше не вызывалось, однако, опять же, поле пароля соответственно не перерисовывается.Я попытался перерисовать всю форму, dataTable, panelGrids и т. Д. Безрезультатно.Я даже попытался обернуть inputSecret в a4j: outputPanel, чтобы не найти никакой разницы.

Я избивал себя из-за этого в течение нескольких дней, и до сих пор не могу найти корреляции между NumberFormatException и reRenderпокушение на могущественный Google (я нашел примеры исключений, генерируемых во время повторного рендеринга, но ошибка не относится к rowIndex).Любые предложения будут с благодарностью, так как мой крайний срок скрипит все ближе и я в недоумении.Если это что-то глупое с моей стороны, обязательно дайте мне знать.

1 Ответ

0 голосов
/ 14 марта 2012

Я наконец понял эту проблему.Ответ заключался в том, чтобы обернутьв

<a4j:outputPanel layout="none" ajaxRendered="false"> </a4j:outputPanel>

и затем установите ajaxSingle = "false" в

Потребовалось некоторое время, чтобы понять это, но, наконец, в последний раз посмотрев документы RichFaces, ответ был найден.

...