2010-11-19 19 views
15

Non riesco a capire come gestire più di un tipo di eccezione da @ExceptionHandler.Spring @ExceptionHandler che gestisce più tipi di eccezioni

Ho bisogno di gestire a livello di programmazione queste eccezioni, per questo ho bisogno di un riferimento condiviso. Questo è fatto tramite questo riferimento "Eccezione ex"? Io non la penso così, perché l'eccezione non viene catturata in questo modo, come farei allora?

Non riesco a mettere tutti i riferimenti di eccezione come argomenti al metodo del gestore, non avrebbe senso, non può essere gestito a livello di codice. Ho bisogno di un riferimento condiviso in modo che ho potuto usare "instanceof" su di esso o semplicemente inviare da qualche altra parte come un generale "Eccezione"

@ExceptionHandler({DescriptionCstOrderException.class, SpecializationCstOrderException.class, NoUploadFileException.class, 
        DeadLineCstOrderException.class, DocumentCstOrderException.class, CommentCstOrderException.class}) 
public String handleFormException(Exception ex, ActionRequest actionRequest) { 
    logger.error(ex.getMessage()); 
    SessionErrors.add(actionRequest, ex.getClass().getName()); 
    return "mainOrderForm"; 
    } 

domanda supplementare: e se volessi gestire org.springframework.web.multipart .MaxUploadSizeExceededException, che non viene lanciato da nessun metodo del gestore? Perché @ExceptionHandler rileva solo le eccezioni generate da uno dei metodi del gestore.

Il metodo exceptionHandler può essere inserito in un controller padre esteso ma se si utilizza solo defaultAnnotationHandlerMapping ...?

Apprezzo tutto l'aiuto, sto impazzendo, questo è molto frustrante ....

risposta

15

Il valore @ExceptionHandler può essere impostato su una serie di tipi di eccezione. Se un'eccezione viene lanciata corrisponde a uno dei tipi nell'elenco, verrà invocato il metodo annotato con la corrispondenza @ExceptionHandler. Se il valore di annotazione non è impostato, vengono utilizzati i tipi di eccezione elencati come argomenti del metodo. Vedi lo documentation per i dettagli.

0

La tua domanda è piuttosto confusa, ma il metodo di gestore di eccezioni gestirà una sola eccezione alla volta. Non catturerà più eccezioni e quindi passerà entrambe nel metodo handleFormException(). Se è necessario gestire questi tipi di eccezioni in modo diverso, è necessario creare un metodo di gestore di eccezioni per ognuno, specificare un argomento di quel tipo di eccezione specifico per il proprio metodo e quindi eseguire la gestione appropriata. Per esempio:

@ExceptionHandler(DescriptionCstOrderException.class) 
public String handleDescriptionCstOrderException(DescriptionCstOrderException exception, ActionRequest actionRequest) {...} 


@ExceptionHandler(SpecializationCstOrderException.class) 
public String handleSpecializationCstOrderException(SpecializationCstOrderException exception, ActionRequest actionRequest) {...} 

// and so on... 

prega di fare riferimento alla documentazione di primavera per ulteriori informazioni:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-exceptionhandler

+0

Voglio gestire allo stesso modo. Li metto in sessionErrors e viewlayer e javascript li gestisce in modo diverso da allora. Quello che volevo sapere era, se il mio esempio è corretto, perché il metodo handleFormException non cattura l'eccezione di uno dei tipi menzionati nell'elenco dei valori di annotazione ... – lisak

+0

se dichiaro un metodo per un tipo di eccezione, esso funziona ... è strano ... A proposito, sai come gestire le eccezioni che vengono lanciate al di fuori del gestore? Voglio dire, usare questo @ExceptionHandlers ... Come ho chiesto alla domanda aggiuntiva ... – lisak

17

Sto solo aggiungendo alla risposta NimChimpsky "Il valore @ExceptionHandler può essere impostato su un array di tipi di eccezioni". L'implementazione di usare array di eccezione, come accennato in primavera documentation sarà come

@ExceptionHandler({NotFoundException.class,MissingServletRequestParameterException.class})

Problemi correlati