我正在使用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
仅填充了第一页的值。这是怎么造成的,我该如何解决?
答案 0 :(得分:4)
您有一个NullPointerException
,因为if
语句需要boolean
,但Map
只包含Boolean
个值null
}}。对于其他页面,它们将是null
。 Boolean
的{{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>