我不知道你只想如何處理這個服務器端。
如果你需要有一個確認看起來像這樣一些用戶交互:「現有的數據將被覆蓋」(或任何你的業務邏輯是在後端)和「是否確定要保存?「,您需要在應用程序的客戶端部分執行此操作。否則,您無法中斷現有流程,請通知您的用戶並讓表單打開。
如果您不需要任何用戶交互,可以使用解決方案「server + backend only」。
下面是如何存儲方法(客戶端)可能看起來像一個素描:
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可以是通用參數)。
如果你有這種模式很多次,很容易使它對你的所有表單(包括接口和抽象類)具有足夠的通用性。這樣你只能寫這個處理一次(在服務器中的一部分和在客戶端中的一部分)。