可能重复:
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
的源代码,它以对象形式存储值。任何指针都会非常有用。
答案 0 :(得分:3)
到目前为止,您的问题是由于非标准Java对象(即没有String
,Number
或Boolean
(JSF具有内置转换器))默认转换为{通过简单的String
电话{1}}。因此,复杂对象最终成为生成的HTML Object#toString()
中的toString()
表示。确切地说,这个值会被提交回服务器。
您可以通过不同方式解决此问题:
提供自定义Converter
,可在<option value>
和ActivityTypeXMLModel
之间进行转换。以下问题回答了以下问题:Primefaces selectOneMenu listener not called with Objects other than Strings
如果您使用的是JSF utility library OmniFaces,那么您还可以使用提供的转换器omnifaces.SelectItemsConverter
或omnifaces.SelectItemsIndexConverter
根据String
执行通用转换值,无需编写自定义转换器。
不要将复杂的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}" />
答案 1 :(得分:0)
adminController.activityDTO.activityParentName
是selectItem
还是字符串?也许,在这种情况下它应该是一个selectItem。