【问题标题】:How to bind p:selectManyCheckbox value to List<String> of a Map<K, List<String>>如何将 p:selectManyCheckbox 值绑定到 Map<K, List<String>> 的 List<String>
【发布时间】:2015-02-02 16:51:15
【问题描述】:

我正在尝试找到一种从多个 p:selectManyCheckbox 填充地图的方法。 但是,当我查看地图中的选定数据时,我会得到一个我无法访问的 Object 属性数组。

<p:dataList id="serviceCatalogueCriteria" var="category" value="#{serviceCatalogueController.categories}">
<ui:fragment
    rendered="#{categoryService.isMultipleSelect(category)}">
    <p:selectManyCheckbox
            value="#{serviceCatalogueController.categoryToAttributes[category]}"
            layout="pageDirection" columns="1"
            converter="#{attributeConverter}">
            <f:selectItems value="#{category.attributes.toArray()}"
                var="attribute" itemLabel="#{attribute.name}"
                itemValue="#{attribute}" />
    </p:selectManyCheckbox>
</ui:fragment>
</p:dataList>

在后面的豆子里我有

private Map<Category, List<Attribute>> categoryToAttributes = new HashMap<Category,List<Attribute>>();

for (Category cat : categoryToAttributes.keySet()) {
        for (Attribute attr : categoryToAttributes.get(cat)) {
            finalList.add(attributeDAO.fetchAttributeWithCategoryAndName(cat.getInternalName(), attr));
        }
    }

当我运行这个时,我得到了一个很好的

[Ljava.lang.Object; cannot be cast to java.util.List

在 categoryToAttributes.get(cat) 处爆炸。拿不到对象 我也尝试使用转换器,但得到的结果几乎相同。

转换器看起来像

@Override
public Object getAsObject(FacesContext context, UIComponent component,
        String value) {
    if (value == null || value.length() == 0)
        return null;
    try {
        Long id = Long.decode(value);
        return attributeDAO.fetchAttributesWithIds(Collections.singletonList(id)).get(0);
    } catch (NumberFormatException e) {
        return null;
    }
}

@Override
public String getAsString(FacesContext context, UIComponent component,
        Object value) {
    if (value == null || !(value instanceof Attribute))
        return null;
    return "" + ((Attribute)value).getId();
}

如果我删除转换器,我会得到这个

java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.util.List

【问题讨论】:

  • categoryToAttributes.get(cat) 返回属于指定 key (cat) 的 value。您的Map 的值是List&lt;String&gt; 类型,您不能将其分配给String(在您的情况下为attr)...
  • @jp-jee 我以前用转换器试过,但也没有用。使用转换器,我得到一个对象数组,其中列出了正确的值和类型,但我无法访问。没有转换器,我得到一个带有字符串元素的对象数组,我也无法访问
  • 您在没有转换器的情况下所经历的与您在使用转换器时所经历的不同。你需要转换器,在一个非常基本的水平。发布足够的代码来帮助我们在您的视图代码和支持 bean 代码之间建立连接。就目前而言,我看不到 value="#{serviceCatalogueController.categoryToAttributes[category] 与您所显示的支持 bean 代码之间的联系

标签: jsf primefaces hashmap selectmanycheckbox


【解决方案1】:

对不起,我的同行英语,我希望可以帮助你。

在 *.xhtml

<p:dataList id="serviceCatalogueCriteria" var="category" 
value="#{serviceCatalogueController.categories}">

<ui:fragment
rendered="#{categoryService.isMultipleSelect(category)}">
<p:selectManyCheckbox
        value="#{serviceCatalogueController.attributesByCategory}"
        layout="pageDirection" columns="1"
        converter="#{attributeConverter}">
        <f:selectItems value="#{category.attributes.toArray()}"
            var="attribute" itemLabel="#{attribute.name}"
            itemValue="#{attribute}" />
<p:ajax listener="#{alta.almacenarModulos(category)}"/>
</p:selectManyCheckbox>
</ui:fragment>
</p:dataList>

在你的 Bean:

private Map<Category, List<Attribute>> attributesMap=new HashMap<>();
private List<Attribute> attributesByCategory;
public void almacenarModulos(Categorycategory)
   {
     attributesMap.put(category,attributesByCategory);
   }

我在一个学者项目中做了一些这样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-22
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多