2011-02-13 71 views
2

我認爲這個問題對於例外是通用的,但讓我們用我的例子。Spring異常消息?它是什麼?

成功登錄後,我有一個「用戶主頁」頁面的以下直接控制器。

@Controller 
@RequestMapping("/user-home") 
public class UserHomeController { 

    private static Log log = LogFactory.getLog(UserHomeController.class); 

    @RequestMapping(method = RequestMethod.GET) 
    public String getUserHome(HttpServletRequest request) { 

     if (request.getSession(false) == null) { 
      throw new UnauthorizedClientException("Could not authenticate request. There is no session present for this request."); 
     } else { 
      return "user_home"; 
     } 
    } 

    @ResponseStatus(HttpStatus.NOT_FOUND) 
    @ExceptionHandler({UnauthorizedClientException.class}) 
    public void handle404() { 
     log.info("An UnauthorizedClientException was thrown inside UserHomeController."); 
    } 
} 

所以,它的工作原理,即我得到默認的404頁面時,沒有會話存在,但我傳入UnauthorizedClientException消息是無處可尋。 404頁面有「Message:」,沒有任何內容。

我的信息去了哪裏?通常傳遞給異常構造函數的消息的目的是什麼?

+0

你指的是什麼信息?您希望在頁面上看到哪條消息? – skaffman 2011-02-13 18:59:04

+0

UnauthorizedClientException(String msg)。我不確定!我只是想知道該異常的構造函數中的消息是什麼,如果有的話。 – 2011-02-13 19:12:18

+0

普通Java異常的構造函數參數中有一個「味精」,我一直對它的目的感到困惑。在這個特定的情況下,我認爲它會在404頁面上結束,但事實並非如此。 – 2011-02-13 19:15:19

回答

4

您誤會了UnauthorizedClientException的用途。它不是爲你呈現一個頁面,而是爲了內部控制流。

當你拋出異常時,Spring會捕獲它,並將它傳遞給handle404()方法。這個方法反過來負責處理相應的異常。

@ExceptionHandler -annotated方法的行爲幾乎與@RequestMapping幾乎一樣。這意味着如果發生任何有用的事情,他們必須返回意見和模型。

但是,您的所有方法正在將異常消息記錄到其內部記錄器並返回。它不會返回一個視圖,所以沒有任何東西會被渲染成默認的錯誤頁面;並且它不返回模型,所以不顯示消息。

您需要將handle404()方法更改爲(a)返回要呈現的JSP的名稱,以及(b)將相應的消息添加到模型中。

0
@ResponseStatus(HttpStatus.NOT_FOUND) 
@ExceptionHandler({UnauthorizedClientException.class}) 
public void handle404() { 

這是否意味着如果你有404和另一個異常類,你的處理程序將不會被調用?如果您刪除@ExceptionHandler註釋會發生什麼情況?

如果您的處理程序在此更改後被調用,它會向我建議您獲得另一個404。

+0

我刪除了註釋,現在異常不會被捕獲。實際上,我有更多的日誌消息,比我在這裏展示的還要多,而且我非常確定這個流程正如我已經展示過的那樣。 – 2011-02-13 18:55:40

1

如何做這樣的事情?

@ExceptionHandler(UnauthorizedClientException.class) 
public ModelAndView handle404(UnauthorizedClientException exception) { 
    ModelAndView modelAndView = new ModelAndView("/errors/404"); 
    modelAndView.addObject("message", exception.getMessage()); 
    return modelAndView; 
} 

這樣,您可以從異常中設置消息並將其顯示在格式良好的404錯誤頁面中。