JSF 2.2 ui:在processDecodes期间重复将输入文本组件提交的值设置为null以用于即时方案

时间:2017-01-05 22:06:59

标签: primefaces jsf-2.2 websphere-liberty myfaces omnifaces

环境:WebSphere Liberty - 16_0_0_3(JEE 7),JSF 2.2,PrimeFaces 6.0,Omnifaces 2.4,JDK 1.7 +

我正在使用primefaces远程命令(通过单击链接并通过其名称调用远程命令)来调用具有immediate = true和partialSubmit = true的actionListener。在简单化的世界中,我正在处理一个内部具有ui:repeat和ui的输出面板:repeat具有p:inputText。

        <p:outputPanel id="_container">
            <ui:repeat var="bean" value="#{controller.beanList}"> 
                <p:inputText value="#{bean.firstName}" />
            </ui:repeat>
        </p:outputPanel>    

<p:remoteCommand name="remoteCommand" actionListener="#{controller.process}" process="_container" update="_container" partialSubmit="true" immediate="true"/>

我也在执行facesContext.renderResponse()作为侦听器中的最后一个语句。

问题:处理ajax请求时提交的任何值都不会在输入文本中重新显示,它将显示为空白。我可以在浏览器开发人员工具中看到提交的值 - 在进一步调查中我发现UIRepeat在processDecodes期间(在申请请求值阶段)通过名为UIRepeat.restoreDescendantComponentStates的方法将submittedValue设置为null(/ p>

但如果我在没有ui的情况下测试相同的场景:重复那么从浏览器提交的任何值都会被重新显示,即

<p:outputPanel id="_container">             
        <p:inputText value="#{controller.firstName}" />
    </p:outputPanel> 

不确定为什么ui:repeat将提交的值设置为null。

以下是@wtlucy

请求的支持bean的测试代码
        package test;

        import java.util.ArrayList;
        import java.util.List;

        import javax.annotation.PostConstruct;
        import javax.faces.view.ViewScoped;
        import javax.inject.Named;

        @Named
        @ViewScoped
        public class Controller {

            private String firstName;

            private List<TestBean> beanList;

            @PostConstruct
            public void initialize(){
                this.beanList = new ArrayList<>();      
                for(int i=0 ; i<2; i++){
                    this.beanList.add(new TestBean());
                }
            }

            public String getFirstName() {
                return firstName;
            }

            public void setFirstName(String firstName) {
                this.firstName = firstName;
            }

            public List<TestBean> getBeanList() {
                return beanList;
            }
        }

           package test;

           public class TestBean {

            private String firstName;

            public String getFirstName() {
                return firstName;
            }

            public void setFirstName(String firstName) {
                this.firstName = firstName;
            }
        }

0 个答案:

没有答案