4

Java Web アプリケーションがあります。基本的には次のようなものです。

editUser.jsp -> ControllerServlet.java -> UpdateUserCommand.java -> UserService.java -> UserDAO.java -> USER_TABLE.db

ユーザーが editUser.jsp ページの [変更を保存] ボタンをクリックすると、成功するとビューが viewUser.jsp ページにリダイレクトされ、そこでユーザーの読み取り専用ビューと「ユーザーの変更が正常に保存されました」というメッセージが表示されます。表示されています。

たとえば、UpdateUserCommand.java は次のことを行います。

user.setWhatevers( /* whatevers */ );
try {
  user = this.userService.updateUser(user);
  messages.recordSuccessMessageForView("User changes successfully saved.");
} catch (Exception x) {
  messages.recordErrorMessageForView("There was an error; "+x.getMessage());
}
/* redirect to viewUser.jsp page */

私の問題は、 UserService.java 内で別のものを呼び出すことです-電子メールを送信する NotificationService.java としましょう。メールの送信に失敗した場合、メール送信エラーをログに記録しますが、通常どおり続行します。

その結果、ユーザーには「正常に保存されました!」というメッセージが表示されます。メッセージが表示されますが、メールが送信されなかったことを示す目に見える兆候はありません。(メール送信エラーはサーバーに記録されますが。)

たとえば、UserService.java は次のことを行います。

public User updateUser(User user) throws Exception {
  try {

    this.userDAO.updateUser(user);

    try {
      this.notificationService.sendEmail("bob@bob.com", "user saved");
    } catch (Exception x) {
      logger.log("Error sending email; "+x.getMessage();
    }

  } catch (Exception x) {
    throw new Exception("Error saving!", x);
  }
}

私の質問は、UserService から UpdateUserCommand に、UI に表示する電子メール関連の警告メッセージがあることをどのように伝えることをお勧めしますか?

UpdateUserCommand.java は、次のことを簡単に実行できます。

messages.recordWarning("Could not send the email.");

しかし、UserService.java は「メッセージ」オブジェクトにアクセスできません。そして、すべてが正常であるかのようにすべてを進めたいので、UserService が例外をスローすることは望ましくありません。

どんな提案でも大歓迎です!

ロブ

4

1 に答える 1

1

考えられる解決策は次の 2 つです。

  1. Service メソッドに、User現在の応答と通知タイプのメッセージを表すものの両方をカプセル化した型を返すようにします。このソリューションは、テストが少し簡単なので、#2 よりも優れています。

  2. noticiationService またはその他のサービスで、「Web ユーザーへのメッセージ」を ThreadLocal に記録し、UI レイヤーでアクセスしてクリアします。このオプションは、基本的にグローバル データを保持している (そして、1 つのスレッド = 1 つの要求を想定している) という点で少し醜いですが、既存のメソッドのシグネチャを変更する必要はありません。

于 2012-08-30T20:41:29.407 に答える