在分页<p:datatable>中使用带有Map的<h:selectbooleancheckbox>会抛出NullPointerException </p:datatable> </h:selectbooleancheckbox>

时间:2012-06-12 07:39:48

标签: jsf primefaces

我正在使用PrimeFaces <p:dataTable>进行分页。我使用<h:selectBooleancheckbox>Map属性进行相应的行选择。我面临的问题是当我选择并提交值时,有一个NullPointerException。仅检查特定行的值。我正在使用JSF 2.0和PrimeFaces 3.0。

我的页面是:

<p:dataTable id="ngoPhotoTab" paginator="true" rows="10" value="#  {photoApprovelBean.lstNgoPhotos}" var="ngoPhoto">
    <p:column headerText="NgoName">
        #{ngoPhoto.ngoName}
    </p:column>
    <p:column headerText="Select">
        <h:selectBooleanCheckbox id="ngoSelect" layout="pageDirection" value="#{photoApprovelBean.checked[ngoPhoto.photo_id]}" />
    </p:column>
    <f:facet name="footer"> 
        <p:commandButton onclick="deletePhoto();" value="Delete" />
    </f:facet>
</p:dataTable>

支持bean逻辑:

public class PhotoApprovelBean {

    public String deleteActPhoto() {
        List checkedItems = new ArrayList();

        try {
            for (Iterator<PhotoApprovelBean> itr = disAppPhotoList.iterator(); itr.hasNext();) {
                PhotoApprovelBean item = (PhotoApprovelBean) itr.next();

                if (checked.get(item.getPhotoId())) {
                    checkedItems.add(item.getPhotoId());
                }
            }

            toDeletePhoto(checkedItems);
        }catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public Map<Long, Boolean> checked = new HashMap<Long, Boolean>();

    public Map<Long, Boolean> getChecked() {
        return checked;
    }
}

NullPointerException中导致if (checked.get(item.getPhotoId()))Map仅填充了第一页的值。这是怎么造成的,我该如何解决?

1 个答案:

答案 0 :(得分:4)

您有一个NullPointerException,因为if语句需要boolean,但Map只包含Boolean个值null }}。对于其他页面,它们将是nullBoolean的{​​{1}}值无法自动生成null。您需要添加一个nullcheck。

boolean

但是,更好的是使用PrimeFaces自己的Boolean itemChecked = checked.get(item.getPhotoId()); if (itemChecked != null && itemChecked) { // ... } 。它会记住其他页面上的选择。 <p:column selectionMode="multiple">方法仅适用于不使用分页的情况。另见the showcase example。以下是它的样子:

Map

<p:dataTable id="ngoPhotoTab" paginator="true" rows="10" 
    value="#{photoApprovelBean.lstNgoPhotos}" var="ngoPhoto"
    selection="#{photoApprovelBean.selectedNgoPhotos}" rowKey="#{ngoPhoto.photoId}"
>
    <p:column headerText="NgoName">
        #{ngoPhoto.ngoName}
    </p:column>
    <p:column headerText="Select" selectionMode="multiple" />
    <f:facet name="footer"> 
        <p:commandButton onclick="deletePhoto();" value="Delete" />
    </f:facet>
</p:dataTable>