1

可能重复:
Primefaces selectOneMenu 侦听器未使用字符串以外的对象调用

我正在创建ListSelectItem

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它以对象形式存储值。任何指针都会非常有帮助。

4

2 回答 2

4

就这一点而言,您的问题是由于默认情况下通过简单调用转换为非标准 Java 对象(即 noStringNumberJSF具有内置转换器的对象)引起的。所以复杂的对象最终会在生成的 HTML 中作为它们的表示。正是这个值被提交回服务器。BooleanStringObject#toString()toString()<option value>

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

  1. 提供一个在和Converter之间转换的自定义。这在以下问题中得到了回答:Primefaces selectOneMenu listener not called with Objects other than StringsActivityTypeXMLModelString

  2. 如果您使用JSF 实用程序库 OmniFaces,那么您还可以使用提供的转换器omnifaces.SelectItemsConverteromnifaces.SelectItemsIndexConverter根据<f:selectItem(s)>值执行通用转换,而无需编写自定义转换器。

  3. 不要提供复杂的 Java 对象类型作为项目值,而是提供标准的 Java 对象类型,例如String. 在您的情况下,您似乎想使用对象的activityParentName属性ActivityTypeXMLModel。为了方便使用自 JSF2 引入var的 属性进行遍历<f:selectItems>,您只需将值更改为 aList<ActivityTypeXMLModel>而不是List<SelectItem>.

    private List<ActivityTypeXMLModel> activityGlobalTypes;
    

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

也可以看看:

于 2013-01-16T13:12:56.940 回答
0

Is adminController.activityDTO.activityParentName a selectItem or a String? Perhaps, it should be a selectItem in this case.

于 2013-01-16T12:07:32.240 回答