Primefaces使用POJO和字符串值自动完成[重复]
Posted
技术标签:
【中文标题】Primefaces使用POJO和字符串值自动完成[重复]【英文标题】:Primefaces autocomplete with POJO and String value [duplicate] 【发布时间】:2016-01-03 04:31:00 【问题描述】:我需要一个带有字符串值的自动完成,因为用户不能通过自动完成方法限制提供的项目,但他们应该能够在搜索字段中写入任何内容。如果他们愿意,他们也可以从建议中进行选择。
现在我总是得到 /archive/overview.xhtml @28,57 itemLabel="#item.name":类'java.lang.String'没有属性'name'。
Xhtml:
<p:autoComplete id="vyraz" value="#archiveView.searchString"
completeMethod="#archiveView.autocomplete"
var="item" itemLabel="#item.name" itemValue="#item.name"
converter="archiveConverter" forceSelection="false" minQueryLength="2"
autoHighlight="false" effect="fade">
<p:column>
<h:outputText value="#item.name"/>
<h:outputText value=" (Barcode: #item.barcode)" rendered="#item.barcode ne null"/>
</p:column>
<p:column>
<h:outputText value="#item.type.label" style="font-weight: bold;"/>
</p:column>
</p:autoComplete>
豆子:
private String searchString; // + getter and setter
public List<ArchiveAutoCompleteDto> autocomplete(String query)
// get and return from lucene index/database
有没有办法实现这个(Primefaces 5.2)? 谢谢!
【问题讨论】:
我已经解决了移除转换器并使用以下标签/值的问题: itemLabel="#item.class.simpleName eq 'String' ? item : item.name" itemValue=" #item.class.simpleName eq 'String' ? item : item.name" 【参考方案1】:p:autocomplete
中的itemValue
属性可以在您不执行任何更新/刷新 p:autocomple 小部件的简单场景中用作转换器的轻量级替换(这基本上意味着您无法执行 update="@form"
或类似)
所以基本上有3种情况:
Pojo + 转换器
必须将属性var
设置为某个表达式才能在 PrimeFaces 中启用“pojo 模式”。
<p:autoComplete
value="#backingBean.myPojo"
completeMethod="#backingBean.autocomplete
var="pojo" itemLabel="#pojo.label"
itemValue="#pojo" converter="pojoConverter">
</p:autoComplete>
在这种情况下,var="pojo"
是 A 类的实例。value="#backingBean.myPojo"
是 A 类型的变量。itemValue="#pojo"
在您请求建议列表时被评估,结果通过getAsString
传递给转换器它产生要在 html 中编码的值(例如:v1
)。
当您从列表中选择一个元素时(例如:v1
),它会被传递回转换器以转换为getAsObject
,这会返回一个类型为 A 的对象以在支持 bean 中设置。转换器像往常一样全权负责将 Pojo 转换为 HTML 值,反之亦然。
public interface Converter
// @return *K* the value to be used in html
// @param obj is provided by the expression (itemValue="#pojo")
public String getAsString(FacesContext context, UIComponent component, Object obj);
// build the pojo identified by String *K*
// @param value *K*
public Object getAsObject(FacesContext context, UIComponent component, String value);
Pojo + 字符串
在这种情况下,您有一个带有字符串字段的 pojo,要提取并在支持 bean 中使用。
<p:autoComplete value="#backingBean.myStringValue"
completeMethod="#backingBean.autocomplete
var="pojo" itemLabel="#pojo.label"
itemValue="#pojo.stringKey">
</p:autoComplete>
流程是一样的,但是
-
itemValue 必须评估为字符串以避免 ClassCasts。
itemValue 直接用作 html 值(就好像它是从
Converter#getAsString
生成的一样)并在选择后设置为 "#backingBean.myStringValue"
。
"#backingBean.myStringValue"
当然必须是字符串。
在您尝试刷新 p:autoComplete
小部件(例如 update="@form")之前,一切正常。 Primefaces 使用来自作为字符串的支持 bean 的值重新评估 itemLabel
(因为出于某种原因,它不会将 itemLabel 存储在 ViewState 中)。因此,您会收到错误消息。其实这个问题没有解决办法,只能提供如案例1)的实现。
纯字符串值
这里没有介绍。
【讨论】:
比链接的答案更有用且更详细。在 Pojo+String 部分,转换器必须被移除,否则你会得到一个 ClassCastException 问题仍然没有解决...... itemLabel 的重新评估打破了每个实现与所需的值作为 String 和 completeMethod 提供 POJO ......它似乎是如此不必要,仍然是多年来一直在黄金面孔......以上是关于Primefaces使用POJO和字符串值自动完成[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用PrimeFaces自动完成获取nullpointer异常
捕获 primefaces <p:autoComplete> 更改事件(检测清空)
在primefaces autocomplete事件中将值重置为null