2013-09-02 4 views
6

Ho un metodo per gestire una particolare classe di eccezioni in un ambiente Spring MVC. La Metod (semplificato) attuazione segueExceptionHandler con ResponseBody: set ResponseStatus nel metodo body

@ExceptionHandler(AjaxException.class) 
@ResponseStatus(value=HttpStatus.BAD_REQUEST) 
@ResponseBody 
public Exception handleException(AjaxException ex) { 
    return ex; 
} 

Questo è funziona bene, ma per restituire un diverso ResponseStatus devo creare un nuovo metodo di gestione.

È possibile modificare lo stato di risposta all'interno del corpo del metodo anziché utilizzare l'annotazione @ResponseStatus senza modificare il tipo restituito?

In caso contrario, è possibile ottenere lo stesso risultato cambiando il tipo restituito (magari serializzando la classe di eccezioni da solo e restituendola come stringa)?

risposta

4

Aggiungere HttpServletResponse alla firma del metodo e chiamare semplicemente il metodo setStatus.

@ExceptionHandler(AjaxException.class) 
@ResponseBody 
public Exception handleException(AjaxException ex, HttpServletResponse response) { 
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
    return ex; 
} 

Qualcosa del genere dovrebbe funzionare.

+0

Corretto! Ho trovato questa soluzione da solo, ma l'applicazione continuava a funzionare male ... il problema era altrove – Gabber

2

Facile, leggere un po 'più attentamente la documentazione di primavera.

È possibile passare lo HttpServletResponse come parametro oggetto. In tale oggetto è possibile impostare il codice di ritorno. La sintassi è la seguente:

@ExceptionHandler(AjaxException.class) 
@ResponseBody 
public AjaxException handleException(AjaxException ex,HttpServletResponse response) { 
      //test code ahead, not part of the solution 

      //throw new NullPointerException(); 

      //end of test code 


    response.setStatus(404);//example 
    return ex; 
} 

Ciò restituirà la serializzazione json dell'eccezione insieme al codice di ritorno http specificato.

EDIT: Ho eliminato questa risposta ieri perché questa soluzione non sembra funzionare. Il problema era un po 'ingannevole: quando si gestisce un'eccezione in questo modo, se il metodo annotato con ExceptionHandler genera un'eccezione stessa, l'eccezione generata viene ignorata e viene invece generata l'eccezione originale.

Il mio codice era in qualche modo simile alla soluzione che ho postato (ha lanciato un'eccezione all'inizio del metodo), quindi non ho potuto vedere l'output JSON, il gestore di eccezioni standard è stato invece licenziato. Per risolvere ho semplicemente provato la linea di lancio delle eccezioni e tutto era ok.