在插件中访问XPages数据源

在插件中访问XPages数据源,xpages,Xpages,对于插件(如扩展库),我尝试使用给定的“var”名称访问数据源。使用以下代码访问数据源对象非常容易: m_DataSourceName包含数据源的名称(var) public DataSource getDataSource() { if (StringUtil.isNotEmpty(m_DataSourceName)) { UIViewRoot vrCurrent = getFacesContext().getViewRoot(); if (vrCur

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

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(),这一点我得到了一个null指针异常。数据源包含一个notes视图。我没有初始化数据源吗?

以下是解决您问题的方法:

这将为您提供视图的所有行,而不是条目计数*。F.e.如果您有一个分类视图,其中有5个类别,每个类别有一个条目,这将产生10行。参赛人数为5人

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

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

  • 设置数据迭代器

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

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

    (( com.ibm.xsp.model.domino.viewnavigator.NOIViewNavigatorEx) tdm.getDominoViewDataContainer().getNavigator()).calculateExactCount(tdm.getView());
    
  • 现在您的行计数已初始化,您可以使用普通getRowCount获得结果:

    希望这有帮助

    *:


    如果您使用的是notes视图,则会收到DominoViewDataModel的实例。这需要com.ibm.xsp.component.FacesDataIterator的实例来访问getRows方法。如果设置了此选项,空指针异常将消失…谢谢Sven,我将尝试此选项。我应该使用com.ibm.xsp.component.FacesDataIterator的子类,还是构建自己的实现?我尝试过,在尝试访问rowdatas之前,它工作得很好。因此,我将tdm.setDataControl(新的DummyDataIterator)更改为tmd.setDataControl(新的UIDataEX()),并且在没有3。计算准确的行部分。。。。谢谢斯文的支持。您将在OpenNTF上的新POI 4 XPages项目中找到完整的解决方案
    (( com.ibm.xsp.model.domino.viewnavigator.NOIViewNavigatorEx) tdm.getDominoViewDataContainer().getNavigator()).calculateExactCount(tdm.getView());
    
    System.out.println("Rows: " +  tdm.getRowCount() );
    
    tdm.getView().getAllEntries().getCount()