0

ページネーションで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()))。TheMapには、最初のページの値のみが入力されます。これはどのように発生し、どうすれば解決できますか?

4

1 に答える 1

4

ステートメントは を予期しているNullPointerExceptionため、を取得しましたが、にはである可能性のある値しか含まれていません。それらは他のページ用になります。の値をに自動ボックス化することはできません。nullcheck を追加する必要があります。ifbooleanMapBooleannullnullBooleannullboolean

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 に答える