对于插件(如扩展库),我尝试使用给定的“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(),这一点我得到一个nullpointer异常。数据源包含注释视图。我错过了初始化数据源的任何内容吗?
答案 0 :(得分:1)
以下是您的问题的解决方案:
这将为您提供视图的所有行,不是条目数* 。 F.E.如果您有一个分类视图,每个类别有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) {}
}
然后你必须做以下事情:
设置数据迭代器
tdm.setDataControl( new DummyDataIterator() );
首次初始化行计数器
tdm.getRowCount();
使用导航器计算确切的行数
(( com.ibm.xsp.model.domino.viewnavigator.NOIViewNavigatorEx) tdm.getDominoViewDataContainer().getNavigator()).calculateExactCount(tdm.getView());
现在您的行计数已初始化,您可以使用正常的 getRowCount 获得结果:
System.out.println("Rows: " + tdm.getRowCount() );
希望这有帮助!
* :
tdm.getView().getAllEntries().getCount()