使用updateAction时,如果后台还存在业务验证会抛出异常时,updateAction中到底要如何处理呢?
我不知道别人是如何处理的,但是按照我以往的经验,一般按照2种方式:
1:使用消息对象, 也就是说整个请求还是代表成功(触发onSuccess),但是返回的对象中存在有消息对象,再进行一次验证 ……其它处理……。
2:后台直接抛出异常,请求失败(触发onFailure),……其它处理……。
讲了方法,再就讲碰到的问题了。
当使用第一种方法的时候,如果你提交的数据中存在子数据(!DIRTY_TREE)。提交返回的信息为未成功,但是对象的状态已经被改变了。
第2次提交时就不会再提交上次已经提交过本次未改变的数据。 这个问题我还没解决,所以我就采用了第2种方式。
使用第二种方法,你会碰到:
arg.error 对象为undefined,也就是无法获得异常对象。
arg.processDefault=false;的情况下,还会弹出 ‘异常’ 的提示框。
过程就跳过,查看源码发现:
arg.error ,根本就没有创建这个属性,异常在 updateAction更底层被内部捕获:
result.text = unescape(exceptionEl.text());
if (exceptionEl.attr("type") == "runnable") {
result._parseRunnableException(result.text);
} else {
result._setException(result._parseException(result.text, batchResult._connObj));
}
所以 arg.processDefault 也没办法阻止。
解决办法也在这段代码上 (exceptionEl.attr("type") == "runnable" , 源码 com.bstek.dorado.view.resolver.ViewServiceResolver
try {
// processTask(escapeWriter, objectNode, context);
processTask(writer, objectNode, context);
writer.append("\n]]></response>\n");
} catch (Exception e) {
Throwable t = e;
while (t.getCause() != null) {
t = t.getCause();
}
writer.append("\n]]></response>\n");
if (t instanceof ClientRunnableException) {
writer.append("<exception type=\"runnable\"><![CDATA[");
writer.append(((ClientRunnableException) t)
.getScript());
} else {
writer.append("<exception><![CDATA[\n");
outputException(jsonBuilder, e);
}
writer.append("\n]]></exception>\n");
logger.error(e, e);
}
writer.append("</request>\n");
}
一切都已经清楚,如果直接抛出异常的话,使用 ClientRunnableException,这个是可以执行script的。