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 が例外をスローすることは望ましくありません。
どんな提案でも大歓迎です!
ロブ