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

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

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

 解决方案:

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

  1. import oracle.jbo.RowSetIterator;// 首先要引包,不然报错!
  2.  
  3. //方法实现如下:
  4. ZReqLinesVOImpl zreqVO = this.getZReqLinesVO();
  5. OAException rowException = null;
  6. int fetchedRowCount = zreqVO.getFetchedRowCount();
  7. RowSetIterator Iter = zreqVO.createRowSetIterator("Iter");// 创建Iterator,用于遍历
  8. int l_setRangeStart = Iter.getRangeStart();
  9. int l_setRangeSize = Iter.getRangeSize();
  10. int l_noEmptyRowCount = 0;
  11. if (fetchedRowCount > 0) {
  12. Iter.setRangeStart(0);
  13. Iter.setRangeSize(fetchedRowCount);
  14. for (int i = 0; i < fetchedRowCount; i++) {
  15. ZReqLinesVORowImpl vendorRow = (ZReqLinesVORowImpl) Iter
  16. .getRowAtRangeIndex(i);
  17. if (vendorRow.getCate1() != null
  18. && vendorRow.getVendorName() == null)// 当一二级不为空,供应商名称为空时,提示。
  19. {// 当填写一二级时,供应商为必填项。请输入第i+1行的供应商。
  20. Iter.setRangeStart(l_setRangeStart);
  21. Iter.setRangeSize(l_setRangeSize);
  22. Iter.closeRowSetIterator();//抛异常前要及时关闭Iterator,否则会出现类命名冲突异常
  23. rowException = new OAException(
  24. "\u5f53\u586b\u5199\u4e00\u4e8c\u7ea7\u65f6\uff0c\u4f9b\u5e94\u5546\u4e3a\u5fc5\u586b\u9879\u3002"
  25. + "\u8bf7\u8f93\u5165\u7b2c"
  26. + (i + 1)
  27. + "\u884c\u7684\u4f9b\u5e94\u5546\u3002",
  28. OAException.INFORMATION);
  29. throw rowException;
  30. }
  31. if (vendorRow.getVendorName() != null)// 当供应商名称不为空时,判断所填的值是否为数据库里存在的供应商
  32. {
  33. 。。。。
  34. Iter.setRangeStart(l_setRangeStart);
  35. Iter.setRangeSize(l_setRangeSize);
  36. Iter.closeRowSetIterator();// 抛异常前要及时关闭Iterator,否则会出现类命名冲突异常 rowException = new OAException(
  37. "\u586b\u5199\u7b2c"
  38. + (i + 1)
  39. + "\u884c\u4f9b\u5e94\u5546\u9519\u8bef\uff0c\u8bf7\u4fee\u6539",
  40. OAException.INFORMATION);
  41. throw rowException;
  42.  
  43. }
  44. }
  45. }
  46. // 最后也要初始化并关闭Iterator
  47. Iter.setRangeStart(l_setRangeStart);// 需要研究下
  48. Iter.setRangeSize(l_setRangeSize);// 需要研究下
  49. Iter.closeRowSetIterator();
  50.  
  51. }

总结:这次修改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. 微信小程序小技巧系列《一》幻灯片,tab导航切换

    作者:gou-tian 来自:github 幻灯片 使用微信小程序原生组件swiper实现. <swiper indicator-dots="{{indicatorDots}}&quo ...

  2. 通过寄生组合式继承创建js的异常类

    最近项目中在做js的统一的异常处理,需要自定义异常类.理想的设计方案为:自定义一个异常错误类BaseError,继承自Error,然后再自定义若干个系统异常,例如用户取消异常.表单异常.网络异常,这些 ...

  3. 自动实现接口的实例,mybatis就是这样实现的

    思考 很多人用过MyBatis,或者使用过SpringData,那么和传统的jdbc相比,差别在哪里呢?传统的dao层,接口需要有实现,需要连接发出sql,需要接收返回值,但是mybatis只需要实现 ...

  4. Android系统build.prop文件

    # begin build properties (开始设置系统性能) # autogenerated by buildinfo.sh (通过设置形成系统信息) ro.build.id=GRI40 ( ...

  5. MongoDB性能优化

    一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...

  6. 推荐13款优秀的Twitter Bootstrap JavaScript插件

    Bootstrap是基于HTML,CSS和JavaScript的简洁灵活的流行前端框架及交互组件集,由微博先驱Twitter在2011年8月开源的整套前端解决解决方案,拥有非常完备和详尽的开发文档,有 ...

  7. 几款主流PHP框架的优缺点评比

    PHP是一种在国内外都比较流行的开源服务器端脚本开发语言.能够适应大中小型项目的开发需求.我们将在这篇文章中向大家介绍几款主流PHP框架及其相关优缺点评比,作为一个参考分享给朋友们. 主要参考的PHP ...

  8. SSL介绍与Java实例

    有关SSL的原理和介绍在网上已经有不少,对于Java下使用keytool生成证书,配置SSL通信的教程也非常多.但如果我们不能够亲自动手做一个SSL Sever和SSL Client,可能就永远也不能 ...

  9. Nancy之Forms authentication的简单使用

    一.前言 想必大家或多或少都听过微软推出的ASP.NET Identity技术,可以简单的认为就是一种授权的实现 很巧的是,Nancy中也有与之相类似的技术Authentication,这两者之间都用 ...

  10. linq lambda let

    1.linq let用法 var query = from x in db.Users let theage = x.age let sexstring = x.sex ? "男" ...