我有一个
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层上访问和清除它.这个选项有点丑陋,因为你基本上保持全局数据(并假设一个线程=一个请求),但它不需要更改现有方法的签名.