环境: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;
}
}