Jsf Primefaces自动完成组件的问题

Jsf Primefaces自动完成组件的问题,jsf,primefaces,Jsf,Primefaces,我有一个使用JDK 8、JSF 2.2(JBoss提供的实现)、Spring 4.2和Primefaces 6.2开发的本地Web应用程序 在应用程序中,我有一个XHTML页面用于编辑对象的一些字段,该对象是名为SiepRoEncabezado的类的实例。其中一个字段是SiepRpaPescador的实例 直到昨天,我还在一个模态对话框中的表单中包含了一个,以便选择一个SiepRpaPescador对象。模式本身有2个submit(一个用于保存更改,一个用于清理表单)和一些传统的输入字段。 模式

我有一个使用JDK 8、JSF 2.2(JBoss提供的实现)、Spring 4.2和Primefaces 6.2开发的本地Web应用程序

在应用程序中,我有一个XHTML页面用于编辑对象的一些字段,该对象是名为SiepRoEncabezado的类的实例。其中一个字段是SiepRpaPescador的实例

直到昨天,我还在一个模态对话框中的表单中包含了一个
,以便选择一个SiepRpaPescador对象。模式本身有2个submit
(一个用于保存更改,一个用于清理表单)和一些传统的输入字段。 模式的开发方式是,当我按下保存按钮成功编辑数据时,它会自动关闭。
带有
的模式工作得很好,但由于要在内存使用方面处理的select项太多,我被迫用以下组件替换

<p:autoComplete dropdown="true" 
                id="rpaAutoComplete"
                value="#{correccionROBean.tmpPescador}" 
                var="itemRpa"
                itemLabel="#{itemRpa.nmPescador.concat(' ').concat(itemRpa.nmPaterno).concat(' ').concat(itemRpa.nmMaterno)}"
                itemValue="#{itemRpa}"
                completeMethod="#{correccionROBean.filtrarRpa}"
                minQueryLength="4"
                maxResults="10"
                forceSelection="true" />

在这里,tmpPescador是托管bean correccionroban中的一个bean。 那里的完整方法运行良好,选择项按需要显示。 但是,当我在
组件中选择一个项目并按下按钮保存更改后,它什么也不做。此外,它不会显示错误消息,也不会引发任何异常。最糟糕的是,如果我试图调试按钮中的action listener方法来保存更改,它什么也不做,就像根本没有调用action listener方法一样。 我放置了一个
标签,希望解决问题,但没有效果:

<p:autoComplete dropdown="true" 
                id="rpaAutoComplete"
                value="#{correccionROBean.tmpPescador}" 
                var="itemRpa"
                itemLabel="#{itemRpa.nmPescador.concat(' ').concat(itemRpa.nmPaterno).concat(' ').concat(itemRpa.nmMaterno)}"
                itemValue="#{itemRpa}"
                completeMethod="#{correccionROBean.filtrarRpa}"
                minQueryLength="4"
                maxResults="10"
                forceSelection="true">
    <p:ajax event="itemSelect" listener="#{correccionROBean.onRpaSelect}" update="rpaAutoComplete"/>
</p:autoComplete>

在这里,当我选择一个项目时,侦听器方法不会被触发。当我尝试调试该方法时,就好像根本没有调用该方法一样

最后,当我在未选择
中的项目的情况下按下save按钮时,然后并且只有在那时,才会触发save
中的action listener方法

什么可能导致这种行为? 提前谢谢

编辑

我在autocomplete组件中添加了字段
immediate=“true”
,该字段触发了ajax提交方法,但仍然无法执行save按钮操作侦听器方法

请参考Melloware的答案以及我对该答案的回复,了解更多详细信息

对于不熟悉转换器的用户:

JSF API中定义的接口转换器允许将输入和输出的数据转换为自动完成组件(以及其他一些JSF UI组件及其子类)。此接口有两种方法:

  • public Object getAsObject(FacesContext context,UIComponent component,String value)
    :此方法必须返回与自动完成组件的
    value
    字段中定义的值属于同一类的对象(在我的例子中,它返回一个sieprpapacescador对象)。您必须在此方法中处理异常,因为它在两种情况下自动调用:
  • 当您在自动完成文本字段中输入字符,并且输入的字符数等于或大于自动完成组件的
    minQueryLength
    字段中定义的值,或者如果未指定它的默认值(在我的情况下,当我输入4个或更多字符时)。在这种情况下,此方法中的
    参数将是您输入的
    字符串
    。请注意,如果像我的情况一样启用了下拉(
    dropdown=“true”
    ),并且按下了下拉按钮,则不会调用此方法

  • 当你提交表格时。在本例中,
    将是自动完成组件中的
    labelValue
    字段的值(在我的示例中,
    {itemRpa.nrFolio}
    ),该字段使用(
    {itemRpa.nrFolio}的实例类中定义的
    toString
    方法转换为字符串
    是一个
    整数
    ,因此该值将使用Integer类自己的
    toString()
    )实现进行转换,或者如果未定义
    toString()
    的实现,则在
    对象
    类中进行转换

    • 公共字符串getAsString(FacesContext上下文、UIComponent组件、对象值)
      :此方法必须返回要在自动完成组件中显示的每个项目的标签值的
      字符串表示形式。参数
      value
      与自动完成组件的
      labelValue
      字段中定义的值属于同一类。当显示项目时,自动调用此方法(无论您是否在自动完成的文本字段中输入字符或按下下拉按钮(如果存在),调用次数与自动完成中的字段
      maxResults
      (在我的例子中为10)中定义的次数相同,使用从
      completeMethod
      的返回列表中获得的对象(在我的例子中,从
      {correccionROBean.filterrpa}
      中获得的列表中的每个对象中,此方法获得它的
      nrFolio
      ,正如我在AutoComplete的
      labelValue
      字段中建立的那样)

    我希望这对你们所有人都有帮助

    你们确定你们的自动完成没有丢失一个转换器吗。以前您的SelectOne使用的是SelectItems,但现在使用AutoComplete,您需要“转换”值。参见这里的POJO示例:非常感谢,它解决了我的问题。我创建了自己的Converter类,作为一个普通类,使用一个构造函数实现
    Converter
    接口,该构造函数接收对象列表,并使用getter和setter创建了一个属性,该属性是托管Bean类中该类的实例。以这种方式使用我的Converter类解决了我的问题,并成功地保存了新数据。显然,我删除了
    标记,因为它在这个解决方案中是不必要的