Primefaces使用POJO和String值自动完成

时间:2015-10-06 09:49:21

标签: jsf jsf-2 primefaces autocomplete converter

我需要一个带字符串值的自动填充功能,因为用户不能通过自动填充方法限制提供的项目,但他们应该能够在搜索字段中编写任何内容。如果他们想要,他们也可以从建议中选择。

现在我总是得到 /archive/overview.xhtml @ 28,57 itemLabel ="#{item.name}":类' java.lang.String'没有属性'名称'

XHTML:

private String searchString; // + getter and setter

public List<ArchiveAutoCompleteDto> autocomplete(String query) {
    // get and return from lucene index/database
}

豆:

def parse_to_words(line)line.split ' '
end

line = "1. Command id = 22 Time = 2:30 <br> 2. Command id = 23 Time = 3:30"

words = parse_to_words line

output= words[0] +  
        " http://localhost:3000/command_id=" + 
        words[4] +
        "/home Time = " +
        words[7] + 
        " <br> " + 
        words[9] +
        " http://localhost:3000/command_id=" +
        words[13] + 
        "/home Time = " +
        words[16]

有没有办法实现这个(Primefaces 5.2)?
谢谢!

1 个答案:

答案 0 :(得分:5)

当您不执行p:autocomple小部件的任何更新/刷新时,itemValue中的

p:autocomplete属性可以在简单的情况下用作转换器的轻量级替换(这基本上意味着您无法执行update="@form"或类似的)

所以基本上有3种情况:

Pojo +转换器

将attributue var设置为某个表达式是必需的,以启用&#34; pojo模式&#34;在PrimeFaces。

<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,它会返回一个在支持bean中设置的类型为A的对象。像往常一样,转换器负责将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 + String

在这种情况下,你有一个带有String字段的pojo,用于提取和在backing bean中使用。

<p:autoComplete value="#{backingBean.myStringValue}" 
    completeMethod="#{backingBean.autocomplete} 
    var="pojo" itemLabel="#{pojo.label}" 
    itemValue="#{pojo.stringKey}">
</p:autoComplete>

流程相同,但

  1. itemValue必须求值为String以避免ClassCasts。
  2. itemValue直接用作html值(就好像它是从Converter#getAsString生成的)并在选中后设置为"#{backingBean.myStringValue}"
  3. "#{backingBean.myStringValue}"必须是字符串。
  4. 一切正常,直到您尝试执行刷新p:autoComplete窗口小部件(例如update =&#34; @ form&#34;)。 Primefaces使用来自支持bean的值(即String)重新评估itemLabel(因为某种原因,它不会将itemLabel存储在ViewState中)。因此,您会收到错误。实际上,没有解决这个问题的方法,而是提供一个实现,如案例1)。

    纯字符串值

    此处未涉及。