2012-07-09 116 views
1

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

问题是只有在绑定到下拉字段的字段的实际值是用作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> 

下不起作用(StringBean.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字段的字符串保存在那里。

有没有一种很好的方法来处理这个问题?

+0

尝试使bean.field的getter/setter的类型为Object例如setField(Object value),Object getField() – BestPractices 2012-07-09 13:45:57

+0

这与'Bean'是一个JPA实体并且'String'类型反映在相应数据库列中的事实相冲突。 – 2012-07-09 14:07:28

+0

我通过使用实际的对象作为'bean.field'的类型来解决这个问题。但我不保存序列化,而是使用'@ OneToOne'代替。这个工作,虽然现在我有很多条目填写我的“项目”表。无论如何,现在可以“关闭”了。 – 2012-07-10 10:14:01

回答

0

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

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

我做过/尝试过。基本功能可以工作,但自定义内容的列不起作用。所以要么我有bean.field的原始类型,要么我可以使用自定义内容/列。看来我无法使用两者(这正是我所需要的)。 – 2012-07-09 15:41:15

+0

PrimeFaces Showcase中的示例使用具有自定义内容的转换器。请仔细检查你是否有缺陷。当我遇到像这样的问题时,我通常会发现通过创建一个简单的测试用例(存根数据并且不会与后端集成)来简化事情非常有用。请注意,如果它是ViewScoped,请确保您尝试绑定到选择列表中的任何内容都是可序列化的,并且您的支持Bean是可序列化的。 – BestPractices 2012-07-09 16:52:20

+0

当且仅当该字段具有对象类型时,转换器和用于显示下拉菜单的“自定义内容”才起作用。如果该字段具有原始类型,则不起作用,例如只是一个字符串。 – 2012-07-10 06:42:17

相关问题