ControllerServlet.java -> UpdateUserCommand.java -> UserSe-6ren">
gpt4 book ai didi

java - 如何将 "warning"消息从 Service/DAO 传递到 UI?

转载 作者:搜寻专家 更新时间:2023-11-01 03:26:45 24 4
gpt4 key购买 nike

我有一个 Java 网络应用程序。基本上是这样的:

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

用户单击 editUser.jsp 页面上的“保存更改”按钮,成功后, View 将重定向到 viewUser.jsp 页面,在那里他们会看到用户的只读 View 和“用户更改成功已保存”消息显示。

例如,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 抛出异常,因为我希望一切都像一切正常一样进行。

非常感谢任何建议!

罗布

最佳答案

两种可能的解决方案:

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

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

关于java - 如何将 "warning"消息从 Service/DAO 传递到 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12205095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com