2011-04-22 42 views
8

我正在使用Spring MVC將一些servlet遷移到Spring框架。目前在每個servlet我們驗證用戶時,如果驗證失敗,我們這樣做:從Spring控制器或服務返回錯誤和消息

if (authfailed) 
{ 
    response.sendError(HttpServletResponse.SC_UNAUTHORIZED, 
        "You are not authorized."); 
    return; 
} 

在前端是一個基於YUI的應用程序,並在返回一個錯誤狀態的「失敗」的回調顯示一個對話框與上面給出的錯誤信息。

我知道在我的控制器中我可以得到響應對象並且調用sendError,但這是處理這個問題的最好方法嗎? sendError也拋出一個IOException,所以我必須捕捉到 - 在每個控制器的每個方法中插入一些煩人的代碼。

我有同樣的問題處理異常 - servlet有try-catch塊,在catch方法中調用sendError。我知道我可以

@ExceptionHandler 
@ResponseStatus(value = HttpStatus.NOT_FOUND) 

記住我的異常處理程序,但不異常處理類需要在每個控制器類?最後,如果在從控制器調用的服務中發生異常,是否將異常冒泡到控制器,還是應該處理服務中的異常(從而將這些異常處理問題推送到服務層)?

這似乎比它應該更困難,但就像在春天很多事情一樣,我可能不知道發生了什麼事情。我想要做的就是在響應中發送錯誤狀態和消息!

感謝,

保羅

回答

16

看起來你有最在你的問題本身:)

重申答案,

有這樣

控制器
@RequestMapping("/test") 
public String verifyAuth(HttpServletRequest request) throws NotFoundException { 
    String id = request.getParameter("id"); 

    if (id == null) 
     throw new NotFoundException("Id not found in the request"); 

    return "success"; 
} 

在NotFoundException.java中聲明異常類,

@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Id Not Found") 
public class NotFoundException extends Exception { 

    public NotFoundException(String msg) { 
     super(msg); 
    } 
} 

這個異常類不一定是每個控制器類。將其聲明爲公共類並將其導入每個需要的控制器中。

這是做到這一點的一種方式。如果你喜歡非春的風情,申報HttpServletResponse的每個控制器的參數和做

@RequestMapping("/test") 
public String verifyAuth(HttpServletRequest request, HttpServletResponse response) { 
    ... 
    try { 
    response.sendError(..) 
    catch(..) {} 
} 

或者您可以使用視圖來顯示錯誤信息,

@RequestMapping("/test") 
public String verifyAuth(HttpServletRequest request, Map<String, Object> map){ 
    String id = request.getParameter("id"); 

    if (id == null) { 
     map.put("status", HttpStatus.NOTFOUND); 
     map.put("reason", "Id Not Found"); 

     return "error" 
    } 
     return "success"; 
} 

確保您的ViewResolver正確,並配置error.jsp獲取錯誤字符串,你可以說。

<body> 
${status} ${reason} 
</body> 

定義error.jsp與良好的CSS對所有類型的錯誤,你會期望。 這些不是唯一的方法。隨着春天你有自由去做任何事情。我已經看到了幾個ppl呈現json對象的錯誤消息。

要回答如果控制器調用的服務發生的錯誤取決於您的方案的另一個問題。比如你正在嘗試讀取用戶存儲,如果用戶商店不提供錯誤發生了,我會處理存在本身,如果一個可從另一個副本用戶存儲讀取,如果我發現用戶不存在我將離開例外控制器拋出。

+3

謝謝 - 我正在過問這個問題。有時,這種情況發生的時候我和春天工作...我得到太多的想法在我的腦海,並且無法理清。 – Paul 2011-04-25 12:11:16

相關問題