2012-11-21 29 views
7

Vorrei porre una domanda sulle migliori pratiche in cui è interessato un controller spring-mvc. Si prega di rivedere il codice qui sotto:Gestione Spring-mvc e gestione delle eccezioni

@Autowired 
    SomeService service; 

    @RequestMapping (...) 
    public @ResponseBody Response createSomething() { 

     try { 

      serviceResponse = service.doSomething(); 

      //create a success response and return 

     } 
     catch (SomeServiceException e) { 
      //create an error response and return 
     } 

} 

La gestione degli errori da eseguire a livello di controller è una pratica normale? O la classe di servizio non dovrebbe generare eccezioni come mostrato sopra. Si prega di rivedere e fammi sapere.

risposta

7

Direi che hai tre strategie a seconda del tuo caso d'uso.

Ci sono circa tre strategie: HandlerExceptionResolver, @ExceptionHandler e la gestione delle eccezioni internamente all'azione.

I casi di utilizzo per questi sono: gestore di eccezioni comune per l'intera applicazione, intero controller, azione specifica di conseguenza.

+0

tutti questi gestori sono associati solo a Spring MVC destra ? Voglio dire posso gestire qualsiasi eccezione inaspettata dal filtro o al di fuori dell'ambito del controller? Perché come da documento dice che le implementazioni di _Spring 'HandlerExceptionResolver' riguardano le eccezioni impreviste che si verificano durante l'esecuzione del controller_ ** i.e. durante l'esecuzione del controller ** – agpt

+0

Sto usando Spring boot con Spring cloud, dove avviene il routing intelligente. quindi nessuna primavera MVC coinvolti. Quale potrebbe essere il modo migliore per gestire l'eccezione a livello globale? Soluzione basata su AOP? – agpt

1

La classe di servizio può/deve generare un'eccezione. È possibile gestire tali eccezioni nel controllore per finalità di registrazione..anche è possibile mostrare le pagine di errore appropriate in base all'eccezione rilevata sul controller..ma che sarà noioso .. meglio prova la gestione delle eccezioni di primavera ... http://www.mkyong.com/spring-mvc/spring-mvc-exception-handling-example/

+0

Rajesh: Non restituisco una vista da questo controller. Sto restituendo un json/ResponseBody, quindi non ho una pagina di errore da visualizzare. Tuttavia, mi piace il tuo suggerimento di usare @ExceptionHandler invece di provare e catturare i blocchi. Funzionerà? Grazie e apprezzate la vostra risposta. – Khush

+0

Khush ... o tu puoi prendere un'eccezione nel controller e inviare il messaggio di errore appropriato come risultato json e mostrare che di conseguenza sullo schermo..questo è fatto in qualche caso minore..ma anche introdurre questo gestore di eccezioni e in caso di ajax lo farai ottieni errorpage.html come risposta ajax..posserai quindi aggiornare questa pagina su un div o iframe sullo schermo ... se ti piace la risposta votala in modo che io possa ottenere alcuni punti :) – Rajesh

2

Direi che la migliore pratica sarebbe usare @ExceptionHandler. Il lato negativo della gestione dell'eccezione nel metodo del controller è che rende il codice meno leggibile e potrebbe essere ripetuto su molti metodi del controller.

Si consiglia di avere una classe base per i controller con definito @ExceptionHandler. In questo modo può essere utilizzato per molti controller diversi, senza alcuna duplicazione di codice. Questo sarebbe più leggibile rispetto all'approccio del risolutore di eccezioni, ma potrebbe essere usato insieme.

0

Definire il bean nel file di definizione bean per la classe Handler. quando viene lanciata un'eccezione in un programma, viene chiamato il metodo resolveException.

public class Handler 
     implements HandlerExceptionResolver 
    { 

     public Handler() 
     { 
     } 

     public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 
     { 
      if(ex instanceof ErrorType1Exception)) 
      { 
       ModelAndView test = new ModelAndView("errorpage1jsppage"); 
return test; 
      } else 
      if(ex instanceof ErrorType2Exception)) 
      { 
       ModelAndView test1 = new ModelAndView("errorpage2jsppage"); 
return test1 
      } 
     } 
    }