【问题标题】:PrimeFaces p:dataList issues error "Property 'ime' not found on type java.lang.String"PrimeFaces p:dataList 发出错误“在 java.lang.String 类型上找不到属性 'ime'”
【发布时间】:2015-06-04 18:16:46
【问题描述】:

我想制作 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。有什么帮助吗?

【问题讨论】:

  • Demonstrator 是公开课吗?
  • 是的,它的休眠 bean :@Entity public class Demonstrator extends Korisnik
  • 它是否适用于更简单的示例?例如只需返回ArrayList&lt;String&gt;?这只是一个调试建议,而不是“解决方案”。
  • 当我只写 #{d} 时,它会调用 Demonstrator 上的 toString() 方法,所以我知道我有一个 Demonstrator 对象而不是 String,但是当我写 #{d.ime} 时,他调用 getIme( ) 在字符串上...
  • 取出整个p:selectCheckboxMenu是否还会出现错误?我知道您说错误消息是在抱怨 #{d.ime},但在 Mathieu 在下面所说的之后,我想排除它。

标签: jsf primefaces datalist


【解决方案1】:

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

因此您需要为您的p:selectCheckboxMenu 添加converter 属性并引用您自己的转换器,或者更好的是,使用Omnifaces 提供的即用型SelectItemsConverter (showcase link),a适用于 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>

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

【讨论】:

  • 这里不是这样,马修。您可以访问复杂对象的基本属性(字符串、整数等),而无需为复杂对象编写转换器。我刚刚使用p:dataList 在本地对此进行了测试,它按预期工作。
  • 这不是关于访问p:dataList 中复杂对象的属性,而是关于设置这些对象(确实会显示在p:dataList 组件中),这要归功于选择组件(p:selectCheckboxMenu in那个案例)
  • 这点很好,Mathieu,但 OP 发布的错误消息是在抱怨 "{d.ime},这是他在 p:selectCheckboxMenu 之外使用的表达式。嗯,但我想缺少转换器可能会导致这种情况,不是吗?如果默认转换器将其视为字符串,则可能缺少转换器导致此错误消息。 (除非您编辑答案,否则我无法删除我的反对票。)
  • @DavidS 是的,你明白了!
猜你喜欢
  • 2012-11-22
  • 2016-09-16
  • 2016-01-10
  • 2019-11-05
  • 2012-05-22
  • 2012-06-06
  • 2015-05-12
  • 2016-09-22
相关资源
最近更新 更多