如果使用过OAF(客户化或标准EBS页面)的人可能会发现这样两个问题:
 1、当在表单上输入内容,点确定按钮出错后,页面显示错误信息,此时不做任何修改,再点确定按钮就不会再执行底层实体对象的验证。
 2、当你输入了内容,提交触发实体对象验证失败后,你所输入的数据可能无法保留,而显示原先的内容或者是默认的值。

 第一个问题的原因是在于触发过实体对象验证,用户不修改任何值,不会引起实体对象的再次验证;第二个问题的原因是在控制器的processFormData方法中,将页面中的值写入视图对象时,触发了实体对象的验证,造成无法把页面中的值写入视图对象属性,而保留原先的值或默认值。
 解决方法如下:
 在控制器中覆盖OAControllerImpl的processFormData方法,设置ROW的状态为STATUS_INITIALIZED。
 if ("Y".equals(pageContext.getTransactionValue("ErrorExist"))) //如果EO验证失败,设置该Transaction值
 {
 RowSetIterator it = vo.createRowSetIterator("initIt");

 int rowCount = vo.getFetchedRowCount();
 it.setRangeStart(0);
 it.setRangeSize(rowCount);

 try
 {
 for (int i=0;i {
 Row row = it.getRowAtRangeIndex(i);
 row.setNewRowState(Row.STATUS_INITIALIZED); // 将不执行实体对象的验证
 }
 }
 finally
 {
 it.closeRowSetIterator();
 }
 }

 super.processFormData(pageContext, webBean);

 然后在processFormRequest中强制执行Row的验证
 if ((pageContext.getParameter("Submit") != null) &&
 ("Y".equals(pageContext.getTransactionValue("ErrorExist"))))
 {
 RowSetIterator it = vo.createRowSetIterator("checkIt");

 ArrayList exptList = new ArrayList();

 int rowCount = vo.getFetchedRowCount();
 it.setRangeStart(0);
 it.setRangeSize(rowCount);

 try
 {
 for (int i=0;i {
 try
 {
 Row row = it.getRowAtRangeIndex(i);

 if (...) // 判断记录是否是新建的记录
 {
 row.setNewRowState(Row.STATUS_NEW); // 对于新建的记录,必须设置STATUS_NEW状态,才会触发实体验证
 }

 row.validate();
 }
 catch(Exception e)
 {
 exptList.add(e);
 }
 }
 }
 finally
 {
 it.closeRowSetIterator();
 }

 if (exptList.size() > 0)
 {
 OAException.raiseBundledOAExcetion(exptList);
 }

 pageContext.removeTransactionValue("ErrorExist");
 }