AjaxButton#onSubmit()にて、
AjaxButton#onError(AjaxRequestTarget target, Form form) 処理の
うまく
ハンドリングできていない
参考
wicket/LinksPage.java at master · apache/wicket
Wicket のExample ずばりその ものな サンプルが あります。 9 Under the hood of the request processing 6.x
Ajax requests
に、AjaxErrorStrategy
の説明が あります。
そもそも、 onSubmit()で エラーが 発生したら、 onError() は 実行されない。
onError()は
[1] 私が
そのため、
[2] 引数同じなので、
AjaxButton sendMessage = new AjaxButton("sendMessage", Model.of(getString("messageButtonLabelText"))) { private static final long serialVersionUID = -8204140666393922700L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { try { // メール送信要求を登録 ContactMailTaskManage contactMailTaskManage = (ContactMailTaskManage) form.getModelObject(); // 内部でJPA呼び出し、ここで、PersistenceExceptionが発生する可能性がある。 mailTaskService.execute(contactMailTaskManage); } catch (PersistenceException e) { log.error("Mail transmission failed.", e); // エラーメッセージを表示して処理を終了 error(getString("messageMailSendError")); target.add(form); return; } // Formに対してのオペレーション token.regenerateToken(); success(getString("messageMailSendSucceed")); target.add(form); } @Override protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { super.updateAjaxAttributes(attributes); // AjaxButton は (というかButtonは) setOutputMarkupId(true) なので、特に呼び出さなくてOK final AjaxCallListener ajaxCallListener = new AjaxCallListener(); ajaxCallListener.onPrecondition("return confirm('" + getString("messageMailSendConfirm") + "');"); ajaxCallListener.onBeforeSend("$('#" + getMarkupId() + "').prop('disabled',true);"); ajaxCallListener.onComplete("$('#" + getMarkupId() + "').prop('disabled',false);$('#" + getMarkupId() + "').focus();"); attributes.getAjaxCallListeners().add(ajaxCallListener); } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { error(getString("messageMailSendError")); target.add(form); } };
ExceptionSettings#setAjaxErrorHandlingStrategy() で Ajax Error時の 振る 舞いを 変更する。
Application クラスで、
getExceptionSettings().setAjaxErrorHandlingStrategy(ExceptionSettings.AjaxErrorStrategy.INVOKE_FAILURE_HANDLER);
[3] デフォルトの
AjaxButton で
失敗時の
@Override protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { super.updateAjaxAttributes(attributes); // AjaxButton は (というかButtonは) setOutputMarkupId(true) なので、特に呼び出さなくてOK final AjaxCallListener ajaxCallListener = new AjaxCallListener(); ajaxCallListener.onPrecondition("return confirm('" + getString("messageMailSendConfirm") + "');"); ajaxCallListener.onBeforeSend("$('#" + getMarkupId() + "').prop('disabled',true);"); // 失敗時のjavascriptの定義 ajaxCallListener.onFailure("alert('onFailure');"); ajaxCallListener.onComplete("$('#" + getMarkupId() + "').prop('disabled',false);$('#" + getMarkupId() + "').focus();"); attributes.getAjaxCallListeners().add(ajaxCallListener); }
どちらで 実装を 進めるか.
個人的には、AjaxErrorStrategy.REDIRECT_TO_ERROR_PAGE
で
個別で
コメント