このサーバー側のみをどのように処理したいのかわかりません。
「<em>既存のデータは上書きされます」(またはバックエンドにあるビジネス ロジック) および「<em>保存してもよろしいですか?」 、アプリケーションのクライアント部分で行う必要があります。そうしないと、既存のプロセスを中断できず、ユーザーに通知してフォームを開くことができません。
ユーザーの操作が不要な場合は、「サーバー + バックエンドのみ」のソリューションが可能です。
これは、store メソッド (クライアント側) がどのように見えるかのスケッチです。
protected void execStore() throws ProcessingException {
ICompanyService service = SERVICES.getService(ICompanyService.class);
CompanyFormData formData = new CompanyFormData();
exportFormData(formData);
//first call of the store method:
SaveResult result = service.store(formData, SaveState.TRY);
//handle result of the first call:
if (result.getState() == SaveResultState.SUCCESSFUL) {
importFormData(result.getFormData());
}
else if (result.getState() == SaveResultState.NEEDS_CONFIRMATION) {
int button = MessageBox.showYesNoCancelMessage(null, "Something is needs confirmation in the backend", "Do you want to save?");
switch (button) {
case MessageBox.YES_OPTION: {
//Recall the store method with an other flag:
result = service.store(formData, SaveState.FORCE);
//handle result of the second call:
if (result.getState() == SaveResultState.SUCCESSFUL) {
importFormData(result.getFormData());
}
else {
throw new ProcessingException("service.store() is not sucessfull");
}
break;
}
case MessageBox.NO_OPTION: {
setFormStored(false);
break;
}
case MessageBox.CANCEL_OPTION:
default: {
throw new VetoException("execStore() was cancelled");
}
}
}
}
SaveResult は次のようなものです。
public class SaveResult {
private final AbstractFormData formData;
private final SaveResultState state;
public SaveResult(AbstractFormData formData, SaveResultState state) {
this.formData = formData;
this.state = state;
}
public AbstractFormData getFormData() {
return formData;
}
public SaveResultState getState() {
return state;
}
}
(これが理にかなっている場合は、バックエンドからの説明を追加し、FormData を汎用パラメーターにすることができます)。
このパターンが何度もある場合は、すべてのフォーム (インターフェイスと抽象クラスを使用) に対して十分に一般的なものにするのは簡単です。この方法では、この処理を 1 回だけ記述します (一部はサーバーに、一部はクライアントに)。