这两天本人接到客户反映的bug:oaf的采购订单页面,在添加超过10行提交后,会出现空指针异常。原来,oaf的默认显示行数为10行,超过10行,页面会分页。报空指针异常,就是因为没有取到分页的行。之前的代码(AM里的某个方法),我是这样写的:

        ZReqLinesVOImpl zreqVO = this.getZReqLinesVO();
int rowCount = zreqVO.getRowCount();
OAException rowException = null;
for (int i = 0; i < rowCount; i++) {
ZReqLinesVORowImpl vendorRow = (ZReqLinesVORowImpl) zreqVO
.getRowAtRangeIndex(i);
if (vendorRow.getCate1() != null
&& vendorRow.getVendorName() == null)// 当一二级不为空,供应商名称为空时,提示。
{
...
}
}

可以看到,第五行的vendorRow我是通过VO来创建的,这就是问题的所在。不知为啥,VO创建的vendorRow只能取到当前页面的行,分页的行取不到。

 解决方案:

 在我一筹莫展之时,一位功能顾问告诉我,系统中有类似的代码,可以参考下。于是我根据他给我找的页面,查看到代码。原来,标准的遍历行,是通过创建一个Iterator来遍历的,可参见博文:http://blog.csdn.net/vslkyjnew/article/details/4552317  。于是修改代码如下:

         import oracle.jbo.RowSetIterator;// 首先要引包,不然报错! 

         //方法实现如下:
ZReqLinesVOImpl zreqVO = this.getZReqLinesVO();
OAException rowException = null;
int fetchedRowCount = zreqVO.getFetchedRowCount();
RowSetIterator Iter = zreqVO.createRowSetIterator("Iter");// 创建Iterator,用于遍历
int l_setRangeStart = Iter.getRangeStart();
int l_setRangeSize = Iter.getRangeSize();
int l_noEmptyRowCount = 0;
if (fetchedRowCount > 0) {
Iter.setRangeStart(0);
Iter.setRangeSize(fetchedRowCount);
for (int i = 0; i < fetchedRowCount; i++) {
ZReqLinesVORowImpl vendorRow = (ZReqLinesVORowImpl) Iter
.getRowAtRangeIndex(i);
if (vendorRow.getCate1() != null
&& vendorRow.getVendorName() == null)// 当一二级不为空,供应商名称为空时,提示。
{// 当填写一二级时,供应商为必填项。请输入第i+1行的供应商。
Iter.setRangeStart(l_setRangeStart);
Iter.setRangeSize(l_setRangeSize);
Iter.closeRowSetIterator();//抛异常前要及时关闭Iterator,否则会出现类命名冲突异常
rowException = new OAException(
"\u5f53\u586b\u5199\u4e00\u4e8c\u7ea7\u65f6\uff0c\u4f9b\u5e94\u5546\u4e3a\u5fc5\u586b\u9879\u3002"
+ "\u8bf7\u8f93\u5165\u7b2c"
+ (i + 1)
+ "\u884c\u7684\u4f9b\u5e94\u5546\u3002",
OAException.INFORMATION);
throw rowException;
}
if (vendorRow.getVendorName() != null)// 当供应商名称不为空时,判断所填的值是否为数据库里存在的供应商
{
。。。。
Iter.setRangeStart(l_setRangeStart);
Iter.setRangeSize(l_setRangeSize);
Iter.closeRowSetIterator();// 抛异常前要及时关闭Iterator,否则会出现类命名冲突异常 rowException = new OAException(
"\u586b\u5199\u7b2c"
+ (i + 1)
+ "\u884c\u4f9b\u5e94\u5546\u9519\u8bef\uff0c\u8bf7\u4fee\u6539",
OAException.INFORMATION);
throw rowException; }
}
}
// 最后也要初始化并关闭Iterator
Iter.setRangeStart(l_setRangeStart);// 需要研究下
Iter.setRangeSize(l_setRangeSize);// 需要研究下
Iter.closeRowSetIterator(); }

总结:这次修改bug让我学到了不少,关于OAF的Iterator还得继续研究下。

OAF通过Iterator标准遍历各行的更多相关文章

  1. <s:iterator>各种遍历用法

    struts2<S:iterator>遍历map小结 1.MapAction.java import java.util.ArrayList;   import java.util.Has ...

  2. 用Iterator实现遍历集合

    使用Collection类的Iterator,可以方便的遍历Vector, ArrayList, LinkedList等集合元素,避免通过get()方法遍历时,针对每一种对象单独进行编码. 示例: C ...

  3. 56 容器(十)——Iterator迭代器遍历容器

    迭代器的获取 LIst与Set容器统一使用他们的对象.Iterator()方法获得迭代器对象,然后使用while循环配合迭代器的方法hasNext()及next()来遍历容器. List<Str ...

  4. Iterator(遍历器) 和 for...of 循环

    是generator的前置知识 generator :https://www.cnblogs.com/wangtong111/p/11322961.html 遍历器(Iterator)就是这样一种机制 ...

  5. Iterator,foreach遍历小计

    此博客对同一操作对比两种遍历方式,以个人忘记时快速捡起为目的. 数据表: 三个List: List<Menu> menuList=menuService.getAllMenus(query ...

  6. 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素

    模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...

  7. 使用Struts2的iterator标签遍历复杂Map种类

    1.建一个Webproject.加入Struts2支持. 2.创建两个实体类: a). Mother(母亲)的Java类. package struts.map.entity; import java ...

  8. [转]使用Enumeration和Iterator遍历集合类

    原文地址:http://www.cnblogs.com/xwdreamer/archive/2012/05/30/2526268.html 前言 在数据库连接池分析的代码实例中,看到其中使用Enume ...

  9. [struts2]Struts遍历标签<s:iterator>总结 [转]

    转至:http://blog.csdn.net/lufeng66/article/details/7338098 struts2的s:iterator 可以遍历 数据栈里面的任何数组,集合等等 以下几 ...

随机推荐

  1. HuffmanTree的浅析和在C#中的算法实现

    无论是在我们的开发项目中,还是在我们的日常生活中,都会较多的涉及到文件压缩.谈到文件压缩,可能会有人想问文件压缩到底是怎么实现的,实现的原理是什么,对于开发人员来说,怎么实现这样一个压缩的功能. 接下 ...

  2. CSS-float详解,深入理解clear:both[转+部分原创]

    首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流. 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为div元素 ...

  3. [Nancy On .Net Core Docker] 轻量级的web框架

    .net core现在已经有了大的发展,虽然笔者现在已经从事python开发,但是一直在关注.net的发展,在逛博客园的时候,发现有大家都会提到Nancy这个框架,在简单的使用之后,发现竟然是如此的简 ...

  4. MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建

    前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...

  5. HTML5模仿逼真地球自转

    查看效果:http://hovertree.com/texiao/html5/8.htm 给我一个支点,我就可以撬动地球 阿基米德 下载 http://hovertree.com/down/h/ear ...

  6. Redis所需内存 超过可用内存怎么办

    爬虫和转载请注明原文地址:博客园蜗牛 http://www.cnblogs.com/tdws/p/5727633.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...

  7. 微信JSApi支付~集成到MVC环境后的最后一个坑(网上没有这种解决方案)

    返回目录 大叔第一人 之前写了关于微信的坑<微信JSApi支付~坑和如何填坑>,今天将微信的jsapi支付封装到了MVC环境里,当然也出现了一些新的坑,如支付参数应该是Json对象而不是J ...

  8. css实现小三角(原理)

    效果图如图1所示:(简单示范,有点丑,莫介意) PS:兼容IE,FF , chrome ,360安全浏览器 先讲下原理吧,如图2所示: 这个div的样式如下所示: div{ width: 0px; h ...

  9. Java中,调试按钮的作用

    调试按钮的主要作用,找错 首先在我们需要找错位置的左边(数字前边)鼠标右键,点击切换断点 点击调试: 找到单步跳入按钮,即可实现步骤的单独运行,方便查找错误的原因, 查找结束记得将断点取消

  10. Css 进阶篇

    一.Css2 高阶知识(常用) 1. css 优先权 优先权(从低到高) 浏览器缺省设置 外部样式表 内部样式表(位于 <head> 标签内部) 内联样式(在 HTML 元素内部) 因此, ...