- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
ControllerServlet.java -> UpdateUserCommand.java -> UserSe-6ren">
我有一个 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 抛出异常,因为我希望一切都像一切正常一样进行。
非常感谢任何建议!
罗布
最佳答案
两种可能的解决方案:
让您的 Service 方法返回某种类型,该类型封装了它当前响应的 User
和表示通知类型消息的内容。此解决方案比 #2 更好,因为它更容易测试。
让 noticiationService 或其他一些服务在 ThreadLocal 中记录它是“网络用户的消息”,然后您可以访问并在 UI 层上清除它。此选项有点丑陋,因为您实际上是在保留全局数据(并且您假设一个线程 = 一个请求),但它不需要更改现有方法的签名。
关于java - 如何将 "warning"消息从 Service/DAO 传递到 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12205095/
我是一名优秀的程序员,十分优秀!