【问题标题】:CustomContent in Primefaces selectOneMenu without persisting objectPrimefaces selectOneMenu中的CustomContent没有持久化对象
【发布时间】:2012-07-09 13:36:54
【问题描述】:

我正在使用 Primefaces SelectOneMenu (http://www.primefaces.org/showcase-labs/ui/selectOneMenu.jsf) 和演示中描述的“自定义内容”版本。

问题在于,只有绑定到下拉字段的字段的实际值是用作value 的对象类型时,这些列才有效。

以下工作(如果Bean.fieldSelectObject 类型):

<p:selectOneMenu value="#{bean.field}"
    var="x">
    <f:selectItems
        value="#{valuesBean.getSelectItems()}" var="bt"
        itemLabel="#{bt.label}" itemValue="#{bt}" />
    <p:column>
        <h:outputText
            value="#{x.value}" />
    </p:column>
    <p:column>
        <h:outputText value="xyz" />
    </p:column>
</p:selectOneMenu>

以下内容不起作用(String 类型的Bean.field):

<p:selectOneMenu value="#{bean.field}"
    var="x">
    <f:selectItems
        value="#{valuesBean.getSelectItems()}" var="bt"
        itemLabel="#{bt.label}" itemValue="#{bt.value}" />
    <p:column>
        <h:outputText
            value="#{x.value}" />
    </p:column>
    <p:column>
        <h:outputText value="xyz" />
    </p:column>
</p:selectOneMenu>

在第一个版本中,xyz 显示为第二列,而在第二个版本中则不是。我遇到的问题是,现在我需要在数据库中保存SelectObject 类型的对象,尽管我也可以将value 字段的字符串保存在那里。

有什么好的方法来处理这个问题吗?

【问题讨论】:

  • 尝试将 bean.field 的 getter/setter 设为 Object 类型,例如setField(Object value), Object getField()
  • 这与 Bean 是 JPA 实体以及 String 类型反映在相应的数据库列中这一事实相冲突。
  • 我通过使用实际对象作为bean.field 的类型解决了这个问题。但是我不再将其序列化,而是使用@OneToOne。这行得通,尽管现在我遇到了许多条目填满我的“项目”表的问题。无论如何,现在可以“关闭”了。

标签: jsf primefaces selectonemenu


【解决方案1】:

使用转换器将所选菜单项的值 (bt.value) 转换为绑定到 p:selectOneMenu (bean.field) 的支持 bean 方法所期望的值。

<p:selectOneMenu value="#{bean.field}" var="x" converter="yourconverterid">

【讨论】:

  • 我做过/试过了。基本功能有效,但自定义内容的列不起作用。所以要么我有 bean.field 的原始类型,要么我可以使用自定义内容/列。看来我不能同时使用两者(这正是我需要的)。
  • PrimeFaces Showcase 中的示例使用具有自定义内容的转换器。请仔细检查您没有缺陷。当我遇到这样的问题时,我通常发现通过制作一个简单的测试用例(存根数据并且不与后端集成)来简化事情很有用。请注意,确保您尝试在选择列表中绑定的任何内容都是可序列化的,并且您的支持 bean 是可序列化的(如果它是 ViewScoped)。
  • 当且仅当字段具有对象类型时,用于显示下拉列表的转换器和“自定义内容”才有效。如果该字段具有原始类型,则它不起作用,例如只是一个字符串。
  • java.lang.String 是一个对象,而不是原语。带有转换器的自定义内容应该可以工作;再次,建议您使用简单的测试用例重新实现解决方案,以排除您没有缺陷。
  • 是的,我确实创建了一个非常简单的示例。 SelectOneMenuvalueselectItemsitemValue 中引用的bean 属性的类型需要相同。同时,该类型用于确定是否显示单独的列(“自定义内容”)。如果类型不同,则验证失败总是(甚至不会触发转换器),如果我将itemValue 更改为原始类型(或字符串),我没有自定义内容不再是来自itemLabel 的标签了。
猜你喜欢
  • 1970-01-01
  • 2017-11-27
  • 2014-04-22
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多