【问题标题】:Primefaces: Add a new row to datatable gives error: DataModel must implement org.primefaces.model.SelectableDataModel when selection is enabledPrimefaces:向数据表添加新行给出错误:启用选择时,DataModel 必须实现 org.primefaces.model.SelectableDataModel
【发布时间】:2012-05-30 12:04:37
【问题描述】:

我有一个要在其中添加新行的数据表。这样做时,我收到以下错误 javax.servlet.ServletException:启用选择时,DataModel 必须实现 org.primefaces.model.SelectableDataModel。

我该如何解决我的问题?

这是在我的 xhtml 中

<h:commandLink  action="#{workOrderDetail.addOrderItem}" >
        <img src="${path.staticRootUrl}images/add.png" border="0" alt="${msg.workorderdetail_neworderitem}" title="${msg.workorderdetail_neworderitem}"/>
     </h:commandLink>
<p:dataTable styleClass="ptable100" id="orderItems" var="orderItem" value="#{workOrderDetail.orderItems}" width="100%" height="200" widgetVar="results"
     emptyMessage="#{msg.all_lists_no_records_found}" selection="#{workOrderDetail.selectedOrderItem}" selectionMode="single" onRowSelectUpdate=":detail:sub"
     rowKey="#{orderItem.id}"
<p:ajax event="rowSelect"  update=":detail:sub" />

这是我的 bean 代码

List<IMWSOrderItem> orderList = null;
public void addOrderItem() throws MWSException {
  IMWSOrderItem newOrderItem = getWorkOrder().getMWSOrder().getMWSOrderItem_Set().getNewMWSOrderItem();      
  getWorkOrder().getMWSOrder().getMWSOrderItem_Set().addMWSOrderItem(newOrderItem);
  orderList = null;   
}
public List<IMWSOrderItem> getOrderItems() throws MWSException {
  if (orderList == null) {
     orderList = new ArrayList(Arrays.asList(getWorkOrder().getMWSOrder().getMWSOrderItem_Set().getMWSOrderItems()));
  }
  return orderList;
}
public IMWSOrderItem getSelectedOrderItem() {
  return selectedOrderItem;
}
public void setSelectedOrderItem(IMWSOrderItem newSelectedOrderItem) {
  this.selectedOrderItem = newSelectedOrderItem;
}

【问题讨论】:

  • 哪个 PF 版本?将rowKey 属性设置为指向var 对象的唯一标识符应该可以解决它,但是您已经设置了它。
  • PrimeFaces 3.2。我知道,我必须添加它,因为起初行选择不起作用。但这现在工作正常。在页面的单独部分中显示每一行的详细信息。但是当添加一个新行时它会失败。奇怪。
  • 好的,找到问题了。添加新项目时,其 ID 默认为 null,并将 id 用作 rowkey。所以我在添加一个新的时将 id 初始化为 -1 并且它可以工作。

标签: jsf datatable primefaces


【解决方案1】:

好的,找到问题了。添加新项目时,其 ID 默认为 null,并将 id 用作 rowkey。所以我在添加新的时将 id 初始化为 -1 并且它可以工作。

【讨论】:

  • 只是一个相关的警告词:我使用了这个解决方案(这不是“本身”坏的),然后几个月后注意到如果与 JPA 实体一起使用(太天真)它可能会导致问题.如果一个实体已经分配了一个 id(例如 -1),它可能会搞乱显式持久化或级联持久化。我最终得到了一个实体类,实际上只得到了 1 个持久化实例(因此它看起来像是 JSF 层中的“实体”之间的串扰),并且我得到了一些 JPA 错误,因为它认为已经存在一个具有 - 1.快速解决方案是检查 -1 然后在坚持之前强制它null
  • 使用暴露的hashCode() 对我有用(虽然不确定是否有安全后果;我无论如何都在使用 hashCode 生成实用程序)。另见stackoverflow.com/questions/18797241/…
【解决方案2】:

不需要设置id为-1,写一个函数如下:

public int getRowKey(Integer id) { return id!=null?id:-1; }

并从@rowKey 中的 el 表达式调用它

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2016-01-03
    • 2016-08-23
    • 1970-01-01
    相关资源
    最近更新 更多