0

スカウト サーバー内でメッセージ (はい/いいえ) を表示する方法はありますか?

この理由は、警告付きで保存するためです。

たとえば、いくつかのエンティティを保存するためのいくつかのロジックと、バックエンドでこのエンティティのいくつかの有効性があります。場合によっては、このレコードを保存すると問題が発生する可能性があることをユーザーに知らせる必要があるため、保存を確認する必要があります。

現在、次のような実装があります。

Scout Client ->         Scout Server       ->           Backend                 ->          Scout Server          ->       Scout Client      ->    Scout Server     -> Scout Backend
save called      pass parameter to backend     try to save; return excaption         return exception to client            present popUp     sent parameter force      force save

しかし、クライアント内でこれを処理する必要があるのは好きではありません。クライアントが保存のみを呼び出し、すべてがスカウト サーバーとバックエンドで処理されるとよいでしょう。

これにはもっと良い方法がありますか?

マルコ

4

1 に答える 1

1

このサーバー側のみをどのように処理したいのかわかりません。

「<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 回だけ記述します (一部はサーバーに、一部はクライアントに)。

于 2015-09-10T09:49:25.237 に答える