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

两种可能的解决方案:

  1. 让您的 Service 方法返回某种类型,该类型既封装了User它当前响应的内容,也封装了表示通知类型消息的内容。这个解决方案比#2 更好,因为它更容易测试。

  2. 让 noticiationService 或其他一些服务在 ThreadLocal 中记录它的“Web 用户消息”,然后您可以在 UI 层访问并清除它。这个选项有点难看,因为您基本上保留了全局数据(并且您假设一个线程 = 一个请求),但它不需要更改现有方法的签名。

于 2012-08-30T20:41:29.407 回答