2016-06-10 718 views
10

考慮下面的映射:Java的春天 - 如何處理缺少必需的請求參數

@RequestMapping(value = "/superDuperPage", method = RequestMethod.GET) 
public String superDuperPage(@RequestParam(value = "someParameter", required = true) String parameter) 
{ 
    return "somePage"; 
} 

我想處理由缺少參數的情況下更改爲required = false。默認情況下,400錯誤被返回,但我想返回讓我們說一個不同的頁面。我如何實現這一目標?

回答

20

如果請求中沒有所需的@RequestParam,Spring將拋出MissingServletRequestParameterException異常。您可以在同一個控制器或在@ControllerAdvice定義@ExceptionHandler來處理異常:

@ExceptionHandler(MissingServletRequestParameterException.class) 
public void handleMissingParams(MissingServletRequestParameterException ex) { 
    String name = ex.getParameterName(); 
    System.out.println(name + " parameter is missing"); 
    // Actual exception handling 
} 

我想回到我們說不同的頁面。我如何實現這一目標?

作爲Spring documentation狀態:

就像用@RequestMapping 註解標準控制器的方法,方法參數和的 @ExceptionHandler方法返回的值可以是柔性的。例如,可以在Portlet環境中的Servlet環境和 PortletRequest中訪問 HttpServletRequest返回類型可以是 String,這被解釋爲一個視圖名稱,一個ModelAndView對象, ResponseEntity,或者也可以添加@ResponseBody有轉換用信息轉換器和寫入 所述的 方法返回值響應流。

+0

@Ali這工作完美。感謝您的幫助。另外,有沒有辦法知道哪種方法拋出這個異常?我無法在'printStack()'中找到它。 – peech

+0

@peech該異常僅封裝參數類型和參數名稱信息。所以不,你不知道什麼方法拋出異常。 –

2

您可以通過利用可選類型與春4.1起和的Java 8做到這一點。在您的示例中,這意味着您的@RequestParamString現在將具有Optional<String>的類型。

Take a look at this article作爲展示此功能的示例。

相關問題