我在Web项目中使用Primefaces 5.3版自动完成功能,我已经为我正在搜索的java实体编写了搜索方法和转换器 . 这些都可以很好地使用p:ajax选项卡在支持bean中正确设置自动完成中选定的实体,并且最初在itemValue中指定的实体名称在文本输入中设置 .

当我然后提交包含此自动完成的表单时,我从自动完成设置的支持bean中的变量保持原样,但是自动完成上的文本输入将显示实体ID而不是我指定的名称在itemValue上 . 这是因为它在我的转换器中调用toString方法,但我希望它仍然显示名称,但我需要转换器..

有没有人遇到过这个可能有帮助的问题?

我找到了一个描述这种行为的其他线程,但它现在已经有几年了,并且没有答案 .

这个帖子是:

http://forum.primefaces.org/viewtopic.php?f=8&t=37918

因为它可能比我有更好的解释...

任何帮助表示赞赏 .


更新:添加了代码

这是我的autocomplete标记,complete方法返回一个实体类型的java List .

<h:form>
    <p:autoComplete id="autocomplete" value="#{bean.selectedEntity}" 
        completeMethod="#{bean.listOfPossibleEntities}" 
         itemValue="#{_e}" itemLabel="#{_e.name}" autocomplete="off" 
         minQueryLength="3"  var="_e"
         placeholder="Enter Entity Name Here"
         converter="EntityConverter" forceSelection="true">
         <p:ajax event="itemSelect" update="enclosingForm"/> 
         <p:column>
            <h:outputText value="#{_e.name}" />
         </p:column>
    </p:autoComplete>
    <p:commandButton update="@form" >
</h:form>

FacesConverter看起来如下,我使用DAO调用我们的数据库找到每个id的对象

private EntityDAO entityDAO = (EntityDAO)Component.getInstance("entityDAO"); 


@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
       Integer id = Integer.valueOf(value);      
        return entityDAO.findById(id,false);
    }

@Override
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
    String result = "";
    if(object != null) {
        if(object instanceof Entity){
            result = ""+ String.valueOf(((Entity) object).getEntityId());
        }
    }
    return result;
}

因此,在选择自动完成中的实体并使用p:commandButton提交值显示或实体将从实体名称更改为实体ID之后更新h:表单时,是 .

希望这有助于进一步感谢 .