【发布时间】:2012-12-30 17:43:42
【问题描述】:
可能重复:
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 的源代码,它以对象形式存储值。任何指针都会很有帮助。
【问题讨论】:
-
直言不讳,您需要转换器或替代方法。另请参阅
[selectonemenu]标记 wiki 页面以获取一些提示:stackoverflow.com/tags/selectonemenu/info -
或者,如果您碰巧已经使用 JSF 实用程序库 OmniFaces,那么您需要做的就是为组件添加
converter="omnifaces.SelectItemsConverter"属性。 -
@BalusC 根据您的建议,我使用了
omnifaces.SelectItemsConverter,并且我已将adminController.activityDTO.activityParentName的数据类型更改为String 为ActivityTypeXMLModel,然后它就可以工作了。还扩展org.omnifaces.converter.SelectItemsConverter它可以工作。有什么办法可以让adminController.activityDTO.activityParentName的数据类型为String,达到我想要的效果?
标签: java jsf jsf-2 primefaces selectonemenu