【问题标题】:javax.faces.model.SelectItem is storing value object as String [duplicate]javax.faces.model.SelectItem 将值对象存储为字符串 [重复]
【发布时间】:2012-12-30 17:43:42
【问题描述】:

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

我将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 的源代码,它以对象形式存储值。任何指针都会很有帮助。

【问题讨论】:

  • 直言不讳,您需要转换器或替代方法。另请参阅[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


【解决方案1】:

直截了当,您的问题是因为非标准 Java 对象(即没有 JSF 内置转换器的 StringNumberBoolean)默认情况下通过简单的 @ 转换为 String 987654331@电话。如此复杂的对象最终在生成的 HTML &lt;option value&gt; 中作为它们的 toString() 表示。正是这个值被提交回服务器。

你可以用不同的方式解决这个问题:

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

  2. 如果您使用的是JSF utility library OmniFaces,那么您还可以使用提供的转换器omnifaces.SelectItemsConverteromnifaces.SelectItemsIndexConverter 来执行基于&lt;f:selectItem(s)&gt; 值的通用转换,而无需编写自定义转换器。

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

    private List<ActivityTypeXMLModel> activityGlobalTypes;
    

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

另见:

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不,绝对不应该。
    • adminController.activityDTO.activityParentName 是字符串。
    猜你喜欢
    • 1970-01-01
    • 2014-05-06
    • 2011-08-09
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2020-01-25
    • 2020-11-15
    • 1970-01-01
    相关资源
    最近更新 更多