martedì 21 febbraio 2012

Utilizzando SimpleMappingExceptionHandler Spring

I miei blog ultimi anni hanno parlato di annotazione ExceptionHandler @ Spring e come si può utilizzare per gestire gli errori su un controller di base di un controller per darvi capillare controllo su come gestire gli errori nel codice. La domanda ora è da considerare se si vuole sempre tale controllo a grana fine, a cui sto cercando di indovinare che in determinate circostanze, la risposta sarà no, e così ad accogliere questa primavera ci hanno fornito con il SimpleMappingExceptionHandler.

Il SimpleMappingExceptionHandler è un'implementazione di classe Springs HandlerExceptionResolver, che, come ho accennato prima, Spring utilizza per gestire le eccezioni generate dal codice. Primavera ha una limitazione (se questo è quello che è) nel senso che carica solo una implementazione HandlerExceptionResolver in qualsiasi momento. L'implementazione di default è AnnotationMethodHandlerExceptionResolver come menzionato nei miei blog precedenti, che ti costringe a fare una scelta tra l'utilizzo a grana fine la gestione delle eccezioni come previsto dalla AnnotationMethodHandlerExceptionResolver e più grossolana gestione delle eccezioni grano fornito da SimpleMappingExceptionHandler. The Guy è al di primavera hanno fatto l'aggiunta di un SimpleMappingExceptionHandler per la vostra applicazione abbastanza semplice. Per dimostrare questo ho prima di tutto bisogno di un controller flakey che un'eccezione per noi. Il codice qui sotto, sollevato dal mio blog precedente, genera una IOException quando viene chiamato ...




01.@ RequestMapping (value = "/ IOException" , method = RequestMethod.GET)
02.pubblico throwAnIOException String (Locale locale, modello Model)
03.throws IOException {
04. 
05.logger.info ( "Questo genera un IOException" );
06. 
07.boolean ThrowException = true ;
08. 
09.se (ThrowException) {
10.gettare nuova IOException ( "Questo è il mio IOException" );
11.}
12. 
13.ritorno a "casa" ;
14.}

... Ed è garantito per rompere un webapp1 Se avevate intenzione di mantenere le cose ultra-semplice, il passaggio finale sarebbe quello di aggiungere il seguente codice XML al file di configurazione di Spring:


01.fagioli: fagioli id "exceptionResolver"
02.class ="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
03.fagioli: property name "exceptionMappings" >
04.fagioli: la mappa >
05.fagioli: ingresso chiave "java.io.IOException" value "io-eccezione" />
06.fagioli: entrata chiave "java.lang.Exception" value "generic-errore" />
07.</ i fagioli: mappa >
08.</ i fagioli: proprietà >
09.</ fagioli: fagiolo >

L'XML sopra mostra una definizione molto familiare bean Spring. Il nome del fagiolo è "exceptionResolver", implementato dalla classe SimpleMappingExceptionResolver. Questa classe ha una proprietà mappa, che è la parte più interessante di questa definizione in quanto associa una classe di eccezione a nome di una vista. Nel campione sono la mappatura IOException ad una vista chiamata 'io-exception' e tutte le altre eccezioni a una vista denominata 'generic-error'. Si noti che SimpleMappingExceptionHandler segue le regole standard di Java gestione delle eccezioni, quindi quando dico " tutte le altre eccezioni degli voglio dire tutte le eccezioni ad eccezione IOException e le sue sottoclassi. Se è vero che avvolge su di esso per un'implementazione banale. Vorrei aggiungere che io preferisco di estendere SimpleMappingExceptionHandler modo che io possa aggiungere in termini di funzionalità aggiuntive, come la registrazione degli errori specifica applicazione:




01.pubblico class SampleExceptionHandler estendeSimpleMappingExceptionResolver {
02. 
03.private static finale Logger logger = LoggerFactory.getLogger (SampleExceptionHandler. classe );
04. 
05./ **
06.* Entra l'eccezione.
07.*
08.* @ see
09.* javax.servlet.http.HttpServletResponse, java.lang.Object,
10.* java.lang.Exception)
11.* /
12.@ Override
13.protetto ModelAndView doResolveException (richiesta HttpServletRequest, la risposta HttpServletResponse, gestore di oggetti,
14.Exception ex) {
15.logger.error ( "A" + ex.getClass () getSimpleName () +. "si è verificato nella domanda" , ex);
16. 
17.tornare Super doResolveException (richiesta, risposta, gestore, ex).;
18.}
19. 
20.}

Una volta che hai scritto il tuo gestore di eccezione, allora tutto ciò che dovete fare è modificare la primavera config in modo che sia raccolto da primavera, quando i carichi webapp:

01.<-! Definizione (s) per il SimpleMappingExceptionResolver ->
02.fagioli: fagioli id "exceptionResolver"
03.class "com.captaindebug.exceptions.SampleExceptionHandler" >
04.fagioli: property name "exceptionMappings" >
05.fagioli: mappa >
06.fagioli: voce chiave "java.io.IOException" value "io-eccezione" />
07.fagioli: ingresso chiave "java.lang.Exception" value "generic-errore" />
08.</ i fagioli: mappa >
09.</ i fagioli: proprietà >
10.</ fagioli: fagiolo >

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.