2016-06-10 14 views
10

Si consideri il seguente mappatura:Java Spring - come gestire mancante richiesta Parametri obbligatori

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

voglio gestire caso parametro mancante per non cambiando a required = false. Per impostazione predefinita viene restituito l'errore 400, ma voglio tornare diciamo una pagina diversa. Come posso raggiungere questo?

risposta

20

Se nella richiesta non è presente una richiesta @RequestParam, Spring genera un'eccezione MissingServletRequestParameterException. È possibile definire un @ExceptionHandler nello stesso controller o in un @ControllerAdvice per gestire tale eccezione:

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

voglio tornare diciamo una pagina diversa. Come posso raggiungere questo?

quanto Spring documentation paese:

Proprio come metodi controllore standard annotati con un'annotazione @RequestMapping , gli argomenti del metodo e valori restituiti di @ExceptionHandler metodi può essere flessibile. Ad esempio, è possibile accedere a HttpServletRequest negli ambienti Servlet e allo PortletRequest in ambienti Portlet. Il tipo di ritorno può essere una String, che viene interpretato come un nome di vista, un oggetto ModelAndView, un ResponseEntity, oppure si può anche aggiungere il @ResponseBody per avere il valore di ritorno metodo convertito con convertitori di messaggi e scritto a il flusso di risposta.

+0

@Ali ha funzionato perfettamente. grazie per l'aiuto. Inoltre, c'è un modo per sapere quale metodo ha lanciato questa eccezione? Non riesco a trovarlo in 'printStack()'. – peech

+0

@peech L'eccezione incapsula solo il tipo param e le informazioni sul nome param. Quindi No, non puoi sapere quale metodo genera l'eccezione. –

2

Si può fare questo con Primavera 4.1 in poi e Java 8 sfruttando il tipo opzionale. Nel tuo esempio ciò significherebbe che il tuo @RequestParamString avrà ora il tipo di Optional<String>.

Take a look at this article per un esempio che mostra questa funzionalità.