【问题标题】:JSF 2 + Richfaces 4.2.3 - <a4j:ajax> will not complete if <rich:pickList> is in the <h:form>JSF 2 + Richfaces 4.2.3 - 如果 <rich:pickList> 在 <h:form> 中,则 <a4j:ajax> 将无法完成
【发布时间】:2012-12-26 08:55:45
【问题描述】:

当在同一表单中存在rich:pickList 或rich:orderingList 时,我在使用h:form 中的a4j:ajax 标记时遇到问题。发生的情况是 ajax 请求未完成,并且我的支持 bean 中的侦听器方法未触发。引发了 onbegin 事件,但未引发 oncomplete。这真的很奇怪。

如果我将组件更改为 Rich:select 或其他类似组件,则 ajax 可以正常工作。

这是我的代码的一部分。

<!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.org/schema/seam/taglib"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:a="http://richfaces.org/a4j"
        xmlns:rich="http://richfaces.org/rich" 
        xmlns:a4j="http://richfaces.org/a4j" 
        template="layout/template.xhtml">
        <ui:define name="body">
            <h:form id="perfil" styleClass="edit">
                <rich:panel>

                        <a4j:outputPanel id="outputPanel">
                    <s:decorate id="nomeField" template="layout/edit.xhtml">
                        <ui:define name="label">Nome</ui:define>
                        <h:inputText id="nome" size="100" maxlength="100"
                            value="#{perfilHome.instance.nome}">
                            <a4j:ajax event="blur" onbegin="alert('begin');"
                                oncomplete="alert('complete');" bypassUpdates="true" render="outputPanel" 
                                listener="#{perfilHome.test()}" />
                        </h:inputText>
                    </s:decorate>
                </a4j:outputPanel>
                    <s:decorate id="descricaoField" template="layout/edit.xhtml">
                        <ui:define name="label">Descrição</ui:define>
                        <h:inputTextarea id="descricao" required="true" cols="100" rows="4" value="#{perfilHome.instance.descricao}" />
                    </s:decorate>
    <s:decorate id="permissoesField" template="layout/edit.xhtml">          
                     <rich:pickList required="true" styleClass="picklist" style="border: none; background: transparent;" 
                        collectionType="java.util.ArrayList" immediate="false" 
                        id="permissaoPickList" 
                        value="#{perfilHome.instance.permissoes}"
                        listWidth="165px" listHeight="100px" orderable="true">
                        <f:selectItems id="permissoesItens" value="#{perfilHome.listarPermissoes()}" var="permissao"
                            itemValue="#{permissao}" itemLabel="#{permissao.nome}" />
                        <s:convertEntity />
                    </rich:pickList>                                
                </s:decorate>                               </rich:panel>
                <div class="actionButtons">
                    <h:commandButton id="save" value="Salvar"
                        action="#{perfilHome.persist}" disabled="#{!perfilHome.wired}"
                        rendered="#{!perfilHome.managed}">
                        <s:conversationId />
                    </h:commandButton>
                    <h:commandButton id="update" value="Salvar"
                        action="#{perfilHome.update}" rendered="#{perfilHome.managed}">
                        <s:conversationId />
                    </h:commandButton>
                    <h:commandButton id="delete" value="Deletar"
                        action="#{perfilHome.remove}" immediate="true"
                        rendered="#{perfilHome.managed}" />                                 </div>
            </h:form>
<s:button id="cancelEdit" value="Cancelar" propagation="end"
                        view="/Perfil.xhtml" rendered="#{perfilHome.managed}" />
                    <s:button id="cancelAdd" value="Cancelar" propagation="end"
                        view="/#{empty perfilFrom ? 'PerfilList' : perfilFrom}.xhtml"
                        rendered="#{!perfilHome.managed}" />
        </ui:define>
    </ui:composition>

正如我所说,我只在 pickList 和 orderingList 中观察到了这种行为。有没有人遇到过这样的问题?

我的第二个问题是,如果我将两个 s:buttons 都放在表单中,ajax 也不会被触发。对此有解释吗?

我正在使用 JSF 2.1.14 + RichFaces 4.2.3 + Seam 2.3.0

谢谢

2013 年 1 月 14 日更新。观察到我以前没有注意到的堆栈跟踪。我认为视图状态正在丢失。用很多组件再次测试,只发现pickList和orderingList有问题。

Exception during request processing:
Caused by java.lang.NullPointerException with message: ""

com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter(PartialViewContextImpl.java:441)
com.sun.faces.context.PartialViewContextImpl.access$300(PartialViewContextImpl.java:71)
com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter.getWrapped(PartialViewContextImpl.java:582)
javax.faces.context.PartialResponseWriter.startDocument(PartialResponseWriter.java:115)
com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:199)
com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:123)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53)
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:397)
org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50)
org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
java.lang.Thread.run(Thread.java:722)

【问题讨论】:

    标签: ajax jsf richfaces seam2


    【解决方案1】:

    很可能您的&lt;rich:pickList/&gt; 转换失败,导致整个表单提交阻塞,原因很明显:您没有在列表中定义转换器并且您正在尝试将复杂类型更新为支持豆。除非您的 value 绑定是常规 java 类型而不是 pojo,否则您必须在 &lt;f:selectItems/&gt; 上实现和定义 JSF 转换器。尝试通过在视图中放置 &lt;h:messages/&gt; 来确认这一点以显示验证/转换错误

    这也是一个很好的理由,为什么建议将 JSF 组件分割成更小的形式,而不是现在的巨大形式;使用更小的表单更容易调试

    【讨论】:

    • 嗨,kolossus。我正在使用接缝标签 所以我真的不认为它是一个转换问题,除非它是一个与接缝相关的问题。我可能会尝试定义一个 JSF 转换器,看看是否能解决问题。在另一个页面中,我遇到了同样的问题,没有将任何复杂类型传递给支持 bean,只有原始类型,ajax 没有完成的原因是
      中的 标签。从表单中删除它们解决了这个问题。顺便说一句,使用
    • @Erick,也许你应该在网络/传输选项卡上检查浏览器的开发者控制台,看看实际访问服务器的内容以及返回的内容
    • 听从了您的建议。 ajax 请求未完成。在请求期间有一些错误(状态 - 302 临时移动),然后显示从缝到调试页面的 GET 请求。但是,不显示调试页面。我用堆栈跟踪更新了我的消息。我想我将为这个错误创建一个 JIRA 问题。我相信视图状态正在丢失。
    • @Erick,您想同时使用股票 JSF 转换器再试一次吗?
    • 当然,我差点忘了。我会尝试一下并将结果放在这里。非常感谢您的帮助。
    猜你喜欢
    • 2014-09-14
    • 2014-04-27
    • 1970-01-01
    • 2012-12-02
    • 2012-10-01
    • 2012-02-25
    • 2012-07-31
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多