0

对于插件(如扩展库),我尝试使用给定的“var”名称访问数据源。使用以下代码访问 Datasource 对象非常容易:

m_DataSourceName 包含数据源的名称 (var)。

public DataSource getDataSource() {
    if (StringUtil.isNotEmpty(m_DataSourceName)) {

        UIViewRoot vrCurrent = getFacesContext().getViewRoot();
        if (vrCurrent instanceof UIViewRootEx) {
            for (DataSource dsCurrent : ((UIViewRootEx) vrCurrent)
                    .getData()) {
                if (m_DataSourceName.equals(dsCurrent.getVar())) {
                    return dsCurrent;
                }
            }
        }
    }
    System.out.println("Datasource name:" + m_DataSourceName);
    return null;
}

我正在取回数据源,并且可以转换此数据源:

private TabularDataModel getTDM(DataSource dsCurrent, FacesContext context) {
        try {
            if (dsCurrent instanceof ModelDataSource) {
                ModelDataSource mds = (ModelDataSource) dsCurrent;
                AbstractDataSource ads = (AbstractDataSource) mds;
                ads.load(context);
                System.out.println(ads.getBeanId());
                if (ads.getBeanId() == null) {

                }
                DataModel tdm = mds.getDataModel();
                if (tdm instanceof TabularDataModel) {
                    TabularDataModel tds = (TabularDataModel) tdm;
                    return tds;
                }
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

现在我想访问 TDM.getRowCount() ,此时我得到了一个空指针异常。数据源包含一个注释视图。我错过了初始化数据源的任何内容吗?

4

1 回答 1

1

这是您的问题的解决方案:

这将为您提供视图的所有行,而不是条目计数*。Fe 如果您有一个包含 5 个类别和每个类别 1 个条目的分类视图,这将导致 10 行。条目数为 5。

首先,创建一个实现FacesDataIterator的虚拟类

public class DummyDataIterator implements com.ibm.xsp.component.FacesDataIterator{

    public DataModel getDataModel() {
        return null;
    }

    public int getFirst() {
        return 0;
    }

    public int getRowIndex() {
        return 0;
    }

    public int getRows() {
        return 0;
    }

    public void setFirst(int paramInt) {}

    public void setRows(int paramInt) {}
}

然后您必须执行以下操作:

  1. 设置数据迭代器

    tdm.setDataControl( new DummyDataIterator() );
    
  2. 第一次初始化行计数器

    tdm.getRowCount();   
    
  3. 使用导航器计算准确的行数

    (( com.ibm.xsp.model.domino.viewnavigator.NOIViewNavigatorEx) tdm.getDominoViewDataContainer().getNavigator()).calculateExactCount(tdm.getView());
    

现在您的行数已初始化,您可以使用普通的getRowCount获得结果:

System.out.println("Rows: " +  tdm.getRowCount() );

希望这可以帮助!

* :

tdm.getView().getAllEntries().getCount()
于 2012-12-14T07:47:17.597 回答