javax.faces.model.SelectItem将值对象存储为String

时间:2013-01-16 11:54:09

标签: java jsf jsf-2 primefaces selectonemenu

  

可能重复:
  Primefaces selectOneMenu listener not called with Objects other than Strings

我正在创建List SelectItem作为:

List<SelectItem> activityGlobalTypes = new ArrayList<SelectItem>();

for (ActivityTypeXMLModel activityTypeXMLModel : filteredActivityTypeXMLModels) {
    activityGlobalTypes.add(new SelectItem(activityTypeXMLModel, activityTypeXMLModel.getParent()));
}

这是下拉菜单:

<p:selectOneMenu id="activityGlobalMenu" value="#{adminController.activityDTO.activityParentName}" required="true">
    <f:selectItem itemLabel="Select One" itemValue="" />  
    <f:selectItems value="#{adminController.activityGlobalTypes}" />
    <p:ajax listener="#{adminController.updateDependentActivity}" />                        
</p:selectOneMenu>

现在来自方法updateDependentActivity

public void updateDependentActivity(AjaxBehaviorEvent event) {
    SelectOneMenu menu = (SelectOneMenu) event.getComponent();
    System.out.println(menu.getValue());//it prints com.edfx.adb.xml.model.ActivityTypeXMLModel@7b6fe3c4

    if(menu.getValue() instanceof ActivityTypeXMLModel) {
        System.out.println("value is ActivityTypeXMLModel"); // I was expecting this one
    } else if(menu.getValue() instanceof String) {
        System.out.println("value is String"); //this line is executing 
    } else {
        System.out.println("unknown");
    }   
}

我检查了SelectItem的源代码,它以对象形式存储值。任何指针都会非常有用。

2 个答案:

答案 0 :(得分:3)

到目前为止,您的问题是由于非标准Java对象(即没有StringNumberBoolean(JSF具有内置转换器))默认转换为{通过简单的String电话{1}}。因此,复杂对象最终成为生成的HTML Object#toString()中的toString()表示。确切地说,这个值会被提交回服务器。

您可以通过不同方式解决此问题:

  1. 提供自定义Converter,可在<option value>ActivityTypeXMLModel之间进行转换。以下问题回答了以下问题:Primefaces selectOneMenu listener not called with Objects other than Strings

  2. 如果您使用的是JSF utility library OmniFaces,那么您还可以使用提供的转换器omnifaces.SelectItemsConverteromnifaces.SelectItemsIndexConverter根据String执行通用转换值,无需编写自定义转换器。

  3. 不要将复杂的Java对象类型作为项值提供,而是提供标准的Java对象类型,例如<f:selectItem(s)>。在您的情况下,您似乎想要使用String对象的activityParentName属性。为了使用自{JS}引入ActivityTypeXMLModel var <f:selectItems>属性以来的简单转换,您只需要将值更改为List<ActivityTypeXMLModel>而不是List<SelectItem>

    private List<ActivityTypeXMLModel> activityGlobalTypes;
    

    <f:selectItems value="#{adminController.activityGlobalTypes}" var="type"
        itemValue="#{type.activityParentName}" itemLabel="#{type.parent}" />
    
  4. 另见:

答案 1 :(得分:0)

adminController.activityDTO.activityParentNameselectItem还是字符串?也许,在这种情况下它应该是一个selectItem。