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异常

从 POJO 注释控制 UI 组件

捕获 primefaces <p:autoComplete> 更改事件(检测清空)

在primefaces autocomplete事件中将值重置为null

Java PrimeFaces自动完成构面在分组时重复相同的组

primefaces民意调查未更新