如何使用 primefaces 自动完成与预选值的组合?

How use primefaces autocomplete into composite with preselected values?

我在 UIInput 组合中使用自动完成 primefaces 组件时遇到问题。我的目标是在自动完成字段中使用预选值初始化应用程序,并相应地显示标签。下面我展示一个测试代码

第testPage.xhtml

<f:view id="view" locale="#{webSession.currentLanguage.locale}">
    <h:head>
        <title>...</title>
     </h:head>
    <h:body>       
        <h:form>
            <utils:element/>
            <p:autoComplete 
                value="#{testPage.attr}" 
                completeMethod="#{testPage.completeMethod}"
                var="item" 
                itemLabel="#{item}"
                itemValue="#{item}" />
        </h:form>
    </h:body>
</f:view>

托管 Bean TestPage.xhtml

@ManagedBean(name = "testPage")
@ViewScoped
public class TestPage {

   private String attr;

   @PostConstruct
   public void init(){
       attr = "value 1";
   }

   public String getAttr() {
       return attr;
   }

   public void setAttr(String attr) {
       this.attr = attr;
   }

   public List<String> completeMethod(String query) {
       return Arrays.asList(new String[]{"1111", "2222", "3333"});
   }
}

这种方法直接在 testPage.xhtml 上使用自动完成功能效果很好。但是,我想将此自动完成包装在 element 组合中,如以下代码所示

element.xhtml 复合页

<ui:component xmlns="http://www.w3.org/1999/xhtml"
   xmlns:p="http://primefaces.org/ui"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:cc="http://java.sun.com/jsf/composite">
   <cc:interface componentType="elementComponent">
   </cc:interface>
   <cc:implementation>  
       <p:autoComplete 
           value="#{cc.attr}" 
           completeMethod="#{cc.completeMethod}"
           var="item" 
           itemLabel="#{item}"
           itemValue="#{item}" />
   </cc:implementation>
</ui:component>

ElementComponent 复合背衬

@FacesComponent("elementComponent")
@ViewScoped
public class ElementComponent extends UIInput implements NamingContainer{

   private String attr;

   @Override
   public String getFamily() {
       return UINamingContainer.COMPONENT_FAMILY;
   }

   public List<String> completeMethod(String query) {
       return Arrays.asList(new String[]{"value 1", "value 2", "value 3"});
   }

   @Override
   public void encodeBegin(FacesContext context) throws IOException {
       attr = "value 1";
   }

   public String getAttr() {
       return attr;
   }

   public void setAttr(String attr) {
       this.attr = attr;
   }
}

但是当我在 testPage.xhtml 中包含元素复合时,自动完成不会显示预选值(与直接实现不同)。有什么办法可以解决这个问题吗? FacesComponent 的实现中可能缺少任何方法或属性?我倾向于认为这是 primefaces 的实现和 composite 的实现之间的一个错误,但我不确定。

问题出在方法 encodeBegin() 上。此实现需要组件 class 的编码,以及 parent (UIInput) 的编码。

不正确

@Override
public void encodeBegin(FacesContext context) throws IOException {
   attr = "value 1";
}

正确

@Override
public void encodeBegin(FacesContext context) throws IOException {
   attr = "value 1";
   super.encodeBegin();
}