使用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的。