Jsf Primefaces自动完成组件的问题
我有一个使用JDK 8、JSF 2.2(JBoss提供的实现)、Spring 4.2和Primefaces 6.2开发的本地Web应用程序 在应用程序中,我有一个XHTML页面用于编辑对象的一些字段,该对象是名为SiepRoEncabezado的类的实例。其中一个字段是SiepRpaPescador的实例 直到昨天,我还在一个模态对话框中的表单中包含了一个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(一个用于保存更改,一个用于清理表单)和一些传统的输入字段。 模式
,以便选择一个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)
字段中定义的值属于同一类的对象(在我的例子中,它返回一个sieprpapacescador对象)。您必须在此方法中处理异常,因为它在两种情况下自动调用:value
minQueryLength
字段中定义的值,或者如果未指定它的默认值(在我的情况下,当我输入4个或更多字符时)。在这种情况下,此方法中的值
参数将是您输入的字符串
。请注意,如果像我的情况一样启用了下拉(dropdown=“true”
),并且按下了下拉按钮,则不会调用此方法
值
将是自动完成组件中的labelValue
字段的值(在我的示例中,{itemRpa.nrFolio}
),该字段使用({itemRpa.nrFolio}的实例类中定义的toString
方法转换为字符串
是一个整数
,因此该值将使用Integer类自己的toString()
)实现进行转换,或者如果未定义toString()
的实现,则在对象
类中进行转换
:此方法必须返回要在自动完成组件中显示的每个项目的标签值的公共字符串getAsString(FacesContext上下文、UIComponent组件、对象值)
字符串表示形式。参数
与自动完成组件的value
字段中定义的值属于同一类。当显示项目时,自动调用此方法(无论您是否在自动完成的文本字段中输入字符或按下下拉按钮(如果存在),调用次数与自动完成中的字段labelValue
(在我的例子中为10)中定义的次数相同,使用从maxResults
的返回列表中获得的对象(在我的例子中,从completeMethod
中获得的列表中的每个对象中,此方法获得它的{correccionROBean.filterrpa}
,正如我在AutoComplete的nrFolio
字段中建立的那样)labelValue
我希望这对你们所有人都有帮助你们确定你们的自动完成没有丢失一个转换器吗。以前您的SelectOne使用的是SelectItems,但现在使用AutoComplete,您需要“转换”值。参见这里的POJO示例:非常感谢,它解决了我的问题。我创建了自己的Converter类,作为一个普通类,使用一个构造函数实现
Converter
接口,该构造函数接收对象列表,并使用getter和setter创建了一个属性,该属性是托管Bean类中该类的实例。以这种方式使用我的Converter类解决了我的问题,并成功地保存了新数据。显然,我删除了
标记,因为它在这个解决方案中是不必要的