PrimeFaces p:dataList 发出错误 "Property 'ime' not found on type java.lang.String"

PrimeFaces p:dataList issues error "Property 'ime' not found on type java.lang.String"

我想制作Checkbox菜单并在dataList中显示数据。这是我的 xhtml:

<h:form>
 <h:panelGrid columns="3" cellpadding="5">
    <h:outputLabel for="menu" value="Demonstratori :" />
    <p:selectCheckboxMenu id="menu" value="#{nastavnik.odabraniDemonstratori}" label="Demonstratori:"
                                  filter="true" filterMatchMode="startsWith" panelStyle="width:250px">
        <f:selectItems value="#{nastavnik.sviDemonstratori}" var="demons" itemLabel="#{demons.ime} #{demons.prezime}" itemValue="#{demons}" />
    </p:selectCheckboxMenu>
    <p:commandLink value="Submit" update="display" />
 </h:panelGrid>

    <p:outputPanel id="display" style="width:250px;padding-left:5px;margin-top:10px">
        <p:dataList value="#{nastavnik.odabraniDemonstratori}" var="d" type="ordered" emptyMessage="Nema odabranih demonstratora">
             #{d.ime}"
        </p:dataList>
   </p:outputPanel>
</h:form>

这是来自 Nastavnik bean 的重要代码:

private ArrayList<Demonstrator> odabraniDemonstratori;
public void setOdabraniDemonstratori(ArrayList<Demonstrator> odabraniDemonstratori) {
    this.odabraniDemonstratori = odabraniDemonstratori;
}


public ArrayList<Demonstrator> getOdabraniDemonstratori() {
    return odabraniDemonstratori;
}

演示程序 bean 有 属性 ime。一切正常,但是当我尝试使用 #{d.ime} 在 dataList 中显示数据时,出现此错误:

/unoslabvezbe.xhtml @84,49 value="#{d.ime}": Property 'ime' not found on type java.lang.String

d 属性 是 Demonstrator 类型而不是 String。有帮助吗?

使用选择组件(例如 p:selectCheckboxMenup:pickList)时,您需要一个转换器来处理复杂的(= 不是简单的字符串)Java 对象作为 f:selectItems。转换器将序列化和反序列化您的实体 Demonstrator.

因此您需要为您的 p:selectCheckboxMenu 添加 converter 属性并引用您自己的转换器,或者更好的是,使用现成的 SelectItemsConverter (showcase link) provided by Omnifaces,一个非常适合 JSF 开发人员的实用程序库(安装很简单:添加 .jar 文件或在 Maven 中添加新的依赖项)。

<p:selectCheckboxMenu id="menu" value="#{nastavnik.odabraniDemonstratori}" converter="omnifaces.SelectItemsConverter" label="Demonstratori:" filter="true" filterMatchMode="startsWith" panelStyle="width:250px">
    <f:selectItems value="#{nastavnik.sviDemonstratori}" var="demons" itemLabel="#{demons.ime} #{demons.prezime}" itemValue="#{demons}" />
</p:selectCheckboxMenu>

注意:要了解有关设计自己的转换器的更多信息(不是要走的路):

  • Generic JSF entity converter
  • How to write a custom converter for <p:pickList>