2012-08-30 48 views
4

我有一個Java Web應用程序。它基本上是這樣的:如何將服務/ DAO中的「警告」消息傳遞給UI?

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("[email protected]", "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引發異常,因爲我希望一切都按照正常進行。

任何建議,非常感謝!

羅布

回答

2

兩個可能的解決方案:

  1. 讓服務方法返回一些類型的封裝了User,它目前的響應和代表通知類型的消息的東西。這個解決方案比#2更好,因爲測試起來更容易一些。

  2. 有一個NoticiationService或其他服務記錄,它是ThreadLocal中的「Web用戶的消息」,然後您可以在UI層訪問並清除它。這個選項有點醜陋,因爲你基本上保持全局數據(並且假定一個線程=一個請求),但它不需要更改現有方法的簽名。