2010-07-11 54 views
8

編輯:我特地到Spring 3的@ExceptionHandler註解,並結合本與選項1下面看起來是一個非常乾淨的解決方案。傳球失誤

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers

我還發現這是一個良好的閱讀: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

我認爲選項1將是你最好的選擇 – skaffman 2010-07-11 22:10:59

回答

4

Java使用異常來自然處理這種事情。最後,它通常會簡化您的邏輯並通過忘記檢查某個錯誤來減少犯錯的機率。您也可以將錯誤邏輯移出代碼的主流程。

我不明白爲什麼你介紹的情況與其他情況下不同,我會使用異常處理來處理錯誤。

+0

謝謝。對Spring 3異常處理程序的進一步調查顯示,我可以通過@ExceptionHandler註釋處理控制器中引發的異常,因爲我可以像處理請求那樣處理異常。 這對我來說似乎比在正常的rqeuest方法中嘗試/捕捉要好一些。 – 2010-07-12 00:15:41

+1

@Ben J:不過我不確定'@ ExceptionHandler'方法是否可以訪問'BindingResult'。 – skaffman 2010-07-12 07:28:28