編輯:我特地到Spring 3的@ExceptionHandler
註解,並結合本與選項1下面看起來是一個非常乾淨的解決方案。傳球失誤
我還發現這是一個良好的閱讀:http://blog.decaresystems.ie/index.php/2006/04/07/difficult-choices-in-handling-exceptions-in-enterprise-java-applications/
我一直在使用了一段時間Spring MVC框架然而現在我在努力拿出一個發展'很好'的方式將服務層中引發的錯誤傳遞迴JSP。
基本上,我不認爲商業邏輯(超越「這個領域是強制性的」)應該在驗證器中,尤其是任何需要訪問數據庫的邏輯。所以,我一直在做的是在服務層中放置更多更復雜的驗證和業務邏輯。
例如,假設我有一個允許用戶購買書籍的頁面。他們在JSP上點擊「購買」,控制器調用服務使其全部發生......現在,如果服務看到他們沒有足夠的資金會發生什麼 - 我如何將此消息返回給JSP,可以向用戶顯示「資金不足」消息嗎?我曾考慮兩種方式,我不知道哪個是正確的?
選項1:異常
我認爲是要提高服務層異常的第一種方式,它的陷阱中控制器並向BindingResult添加消息。
服務:
public void pay(Book book) throws InsufficientFundsException {
// Some logic goes here, which ends up throwing the above exception
}
控制器:
public ModelAndView(@ModelAttribute("book") Book book, BindingResult errors) {
try {
pay(book);
} catch (InsufficientFundsException ex) {
errors.reject("insufficient.funds");
}
return new ModelAndView(blahblahblah);
}
選項2:山口BindingResult到服務層
的第二種方式是把BindingResult對象傳遞到服務層和進一步反對它的錯誤。
服務:
public void pay(Book book, BindingResult errors) {
// User has insufficient funds, so...
errors.reject("insufficient.funds);
}
我可以看到這兩種方法都存在問題。選項1感覺很尷尬,因爲我不僅需要捕捉異常,而且還必須將錯誤添加到綁定結果中,因此感覺就像兩次做同樣的事情。而選項2似乎將服務層與控制器綁定得太緊。
最後,我意識到有可能與方案1結合使用SimpleMappingExceptionResolver
,但我不知道它是多麼合適的(也許是我還沒有看到一個適當的例子嗎?)。在上面的例子中,讓我們爲參數的緣故說,我希望用戶返回到原始表單,並在表單上方出現紅色錯誤,而不是重定向到完全不同的頁面。 SimpleMappingExceptionResolver對我來說很有用,當你想在用戶發生某種異常(這不是我想知道該怎麼做的)時將用戶重定向到標準錯誤頁面。
我認爲選項1將是你最好的選擇 – skaffman 2010-07-11 22:10:59