如何将服务/ DAO中的“警告”消息传递给UI?

我有一个
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无权访问“messages”对象.而且我不希望UserService抛出异常,因为我希望一切都继续进行,好像一切正​​常.

任何建议都非常感谢!

最佳答案 两种可能的解决方

>让您的Service方法返回一些类型,该类型封装了当前响应的User和表示通知类型消息的内容.这个解决方案比#2更好,因为它更容易测试.
>让NoticiationService或其他服务在ThreadLocal中记录它是“Web用户的消息”,然后您可以在UI层上访问和清除它.这个选项有点丑陋,因为你基本上保持全局数据(并假设一个线程=一个请求),但它不需要更改现有方法的签名.

点赞