0

我正在使用<p:dataTable>带有分页的 PrimeFaces。我使用<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()))。TheMap仅填充第一页的值。这是如何引起的,我该如何解决?

4

1 回答 1

4

你得到了 a NullPointerException,因为该if语句需要 a boolean,但只Map包含Boolean可能是的值null。它们将null用于其他页面。的Booleannull不能自动装箱为boolean. 您需要添加一个空检查。

Boolean itemChecked = checked.get(item.getPhotoId());

if (itemChecked != null && itemChecked) {
    // ...
}

然而,更好的是使用 PrimeFaces 自己的<p:column selectionMode="multiple">代替。它会记住其他页面上的选择。该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>

private PhotoApprovelBean[] selectedNgoPhotos;
于 2012-06-12T11:24:02.290 回答